我今晚一直在圍繞使用道具來設置組件的初始狀態這個話題進行一些研究,並且我遇到了爭論雙方的人。因此,我的問題有兩個部分。使用道具來初步設置狀態
1)我在做什麼考慮反模式?從我可以告訴它不是 - 根據this article如果是這樣,它有什麼特別的錯誤?
2)有沒有另外一種方法可以在不使用道具設置狀態的情況下重寫這個邏輯?
父組件:
class App extends Component {
constructor(props){
super(props);
this.state ={
todos: []
}
}
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/todos')
.then(response => {
this.setState({ todos: response.data })
});
}
render() {
if(!this.state.todos){
return <div>Loading...</div>
}
return (
<div className="container">
<div className="row">
{
this.state.todos.map((todo, i) => {
return (
<Todo todo={todo} key={i}/>
)
})
}
</div>
</div>
);
}
}
輔元件
class Todo extends Component{
constructor(props) {
super(props);
var { title, completed, userId } = this.props.todo;
this.state = { title, completed, userId }
}
changeCompletion =() => {
this.setState({completed: !this.state.completed})
}
render() {
return(
<div className="col-md-4 col-sm-6">
<div className={"card card-inverse text-center " + (this.state.completed ? 'card-success' : 'card-danger')}>
<div className="card-block">
<blockquote className="card-blockquote">
<p>{ this.state.title }</p>
</blockquote>
<button onClick={this.changeCompletion} className={"btn btn-sm " + (this.state.completed ? 'btn-danger' : 'btn-success')}>{ this.state.completed ? 'incomplete' : 'complete'} </button>
</div>
</div>
</div>
)
}
}
很好的解釋!你的實現工作完美。我沒有考慮過使用回調,但可以看到這是一個有價值的工具。一個後續問題,在這個特定的例子中,因爲有200個待辦事項被渲染,而且我只是每次只改變一個完成狀態,這是否會是一個手動配置shouldComponentUpdate()函數可能是不同的實例1渲染與200?它本質上是_bad_渲染所有200 todos? – coloradocolby
答案太大而不適合評論,因此我更新了上面的答案。請看一下。 –
明白了。我想我可能是清楚的。我會做更多的挖掘,以確保我非常感謝你的幫助! – coloradocolby