以下是我的代码(工作正常),在其中我可以根据文本框中提供的输入对列表进行排序。在constructor
方法中,我这样声明我的状态-
this.state = {
data: ["Adventure", "Romance", "Comedy", "Drama"],
tableData: []
};
在componentDidMount
方法中,我在data
中分配了tableData
键状态。
componentDidMount() {
this.setState({
tableData: this.state.data
});
}
我的问题是-这样是否正确,因为我自己对此代码质量不满意(将tableData初始化为[]
,然后在tableData: this.state.data
中设置componentDidMount
方法 )。让我知道我是否可以改善这一点,如果我fetch
来自API的数据(这是在应用中进行初始化和使用的最佳位置)的数据,将会改变什么。
工作代码示例-https://codesandbox.io/s/k9j86ylo4o
代码-
class App extends Component {
constructor(props) {
super(props);
this.state = {
data: ["Adventure", "Romance", "Comedy", "Drama"]
};
this.handleChange = this.handleChange.bind(this);
}
refineDataList(inputValue) {
const listData = this.state.data;
const result = listData.filter(item =>
item.toLowerCase().match(inputValue.toLowerCase())
);
this.setState({
data: result
});
}
handleChange(e) {
const inputValue = e && e.target && e.target.value;
this.refineDataList(inputValue);
}
render() {
return (
<div className="App">
<h3>DATA SEARCH</h3>
<div className="form">
<input type="text" onChange={this.handleChange} />
</div>
<div className="result">
<ul>
{this.state.data &&
this.state.data.map((item, i) => {
return <li key={i}>{item}</li>;
})}
</ul>
</div>
</div>
);
}
}
答案 0 :(得分:1)
您做得很好,但是您是对的,有一种方法可以更好地完成它,处理两个难以维护的真理,因此您应该只有一个数据数组,其中包含需要的单词,因此过滤值的方法是在状态中创建一个filter
变量以存储要过滤的当前单词,因此您应该添加类似
// in the constructor function
constructor(props) {
super(props);
this.state = {
data: ["Adventure", "Romance", "Comedy", "Drama"],
filter: ""
}
}
// create a filter function
getFilteredResults() {
const { filter, data } = this.state;
return data.filter(word => String(word).toLowerCase().match(filter));
}
// and finally into your render function
render() {
return (
<div>
{this.getFilteredResults().map((word) => (
<div>{word}</div>
))}
</div>
);
}
显然记得要像这样更新您的handleChange
函数
handleChange(e) {
const inputValue = e && e.target && e.target.value;
this.setState({ filter: inputValue });
//this.refineDataList(inputValue);
}
这样,您将只维护一个事实点,它将按预期运行。
注意:我们使用String(word).toLowerCase()
来确保当前word
实际上是string
,因此,如果由于某些原因单词不是,则可以避免toLowerCase is not function of undefined
错误一个字符串。