Cách em làm là như đoạn code dưới, chỉ có một state là dataSource .Đầu tiên là copy dataSource vào một biến mới. Sau đó em gõ vào TextInput (text.length > 0) thì nó sẽ search ra cái item đó nhưng khi em xóa ô TextInput (text.length < 0) thì nó lại giữ nguyên cái kết quả tìm kiếm trước đó và không thể search được nữa. Cái logic của em là copy dataSource ra mảng mới sau đó kiểm tra nếu text.length > 0 thì sẽ filter xong rồi setDataSource(data) , nếu text.length < 0 thì sẽ không filter và setDataSource(data)
const search = (text) => {
setSearchTerm(text);
let data = [...dataSource];
if (text.length > 0) {
console.log('searhTerm has value');
data = data.filter(item => {
return item.name.toLowerCase().indexOf(text.toLowerCase()) !== -1;
})
setDataSource(data);
} else {
console.log('searchTerm does not have value');
setDataSource(data);
}
}
Đây là cách giải quyết em tìm hiểu trên google, em sẽ tạo ra hai state là dataSource và dataBackup. Khi text.length > 0 thì sẽ tạo ra một biến data , lấy dataBackup từ state filter xong gán vào biến data xong rồi setDataSource(data). Ngược lại thì em setDataSource(dataBackup). Cách này thì giải quyết được vấn đề nhưng em thắc mắc tại sao phải tạo thêm một state . Cả hai state dataSource và dataBackup đều được gán chung một nguồn dữ liệu.
const search = (text) => {
setSearchTerm(text);
if (text.length > 0) {
const data = dataBackup.filter(item => {
return item.name.toLowerCase().indexOf(text.toLowerCase()) !== -1;
});
setDataSource(data);
} else {
setDataSource(dataBackup);
}
}
Em cảm ơn mọi người