gpt4 book ai didi

javascript - 在 ComponentDidMount 中赋值,而不是 React 中的构造函数

转载 作者:行者123 更新时间:2023-12-02 23:47:56 24 4
gpt4 key购买 nike

以下是我的代码(工作正常),我可以在其中根据文本框中提供的输入对列表进行排序。在 constructor 方法中,我像这样声明了我的状态 -

this.state = {
data: ["Adventure", "Romance", "Comedy", "Drama"],
tableData: []
};

componentDidMount 方法中,我在 tableData 中分配 data 键状态。

  componentDidMount() {
this.setState({
tableData: this.state.data
});
}

我的问题是 - 这是执行此操作的正确方法吗,因为不知何故我自己对此代码质量没有信心(将 tableData 初始化为 [] ,然后设置 tableData: this. componentDidMount 方法中的 state.data )。如果我可以改进这一点,请告诉我,如果我从 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>
);
}
}

最佳答案

你做得很好,但你是对的,有一种方法可以更好地做到这一点,处理两个事实点很难维护,所以你应该只有一个包含你需要的单词的数据数组,所以您应该过滤值的方法是在状态中创建一个 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 错误。

关于javascript - 在 ComponentDidMount 中赋值,而不是 React 中的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com