Hỏi về event trong React

javascript

(Phạm Vân) #1

Chào mọi người! Em đang học React và có thắc mắc về đoạn code sau:
#App.js

import React from 'react';
import CardList from './CardList';
import SearchBox from './SearchBox';
import { robots } from './robots';

class App extends React.Component{
	constructor(){
		super();
		this.state = {
			robots: robots,
			searchField: '',
			filteredRobots: robots
		}
		this.onSearchChange = this.onSearchChange.bind(this);
	}

	onSearchChange(event){
		this.setState({
			searchField: event.target.value
		});
		//====================
		const filteredRobots = this.state.robots.filter(robots => {
			return robots.name.toLowerCase().includes(this.state.searchField.toLowerCase());
		});
		console.log(filteredRobots);
		//====================
	}

	render(){
		return(
			<div className='tc'>
				<h1>RoboFriends</h1>
				<SearchBox onChange={this.onSearchChange} searchField={this.searchField}/>
				<CardList robots={filteredRobots} />
			</div>
		);
	}
}

export default App;

#SearchBox.js

import React from 'react';

class SearchBox extends React.Component{
	render(){
		return(
			<div className='pa2'>
				<input
					className='pa3 ba b--green bg-lightest-blue'
					type='search'
					placeholder='search robots'
					onChange={this.props.onChange} 
				/>
			</div>
		);
	}
}

export default SearchBox;

Thì khi em gõ vào searchBox. filteredRobots cứ cập nhật trễ, ví dụ e đã gõ “ca” thì filteredRobots chỉ mới lọc theo “c” và in ra console.
Sửa App.js lại thành

import React from 'react';
import CardList from './CardList';
import SearchBox from './SearchBox';
import { robots } from './robots';

class App extends React.Component{
	constructor(){
		super();
		this.state = {
			robots: robots,
			searchField: '',
			filteredRobots: robots
		}
		this.onSearchChange = this.onSearchChange.bind(this);
	}

	onSearchChange(event){
		this.setState({
			searchField: event.target.value
		});
		
	}

	render(){
        //====================
		const filteredRobots = this.state.robots.filter(robots => {
			return robots.name.toLowerCase().includes(this.state.searchField.toLowerCase());
		});
		console.log(filteredRobots);
		//====================
		return(
			<div className='tc'>
				<h1>RoboFriends</h1>
				<SearchBox onChange={this.onSearchChange} searchField={this.searchField}/>
				<CardList robots={robots} />
			</div>
		);
	}
}

export default App;

thì fillteredRobots không còn bị cập nhật trễ nữa. Mong mọi người giải thích giúp em! Em xin cảm ơn


(Phạm Vân) #2

Em hiểu tại sao rồi ạ!


(*grab popcorn*) #3

Theo rì quét


(*grab popcorn*) #4

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?