與SO有關的許多帖子無法更新ReactJS中的道具。例如。 this one。關於更新ReactJS中的道具
在所涉及的崗位給出解釋,這是ReactJS哲學的一部分,有助於調試等也this answer(在同一個線程)顯示了它是如何內ReactJS完成(通過使用Object.freeze
)。
我ReactJS新手,所以放在一起這個小例子來試試,看看會發生什麼,當一個人試圖修改道具(也jsfiddle)
<!doctype html>
<html>
<body>
<div id='react-app'></div>
<script src="https://cdn.jsdelivr.net/react/0.14.0-rc1/react.js"></script>
<script src="https://cdn.jsdelivr.net/react/0.14.0-rc1/react-dom.js"></script>
<script type='text/javascript'>
var rce = React.createElement.bind(React);
var TodoList = React.createClass({
propTypes: {
todos: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
},
render: function() {
var props = this.props;
var todos = this.props.todos;
var self = this;
return rce('div', {}
,rce('ul', {}
, (function(){
return todos.map(function(x, i) {
return rce('li', {key: i}, x);
});})())
,rce('button', {onClick: function() {
// delete props.todos; // fails
// props.todos = []; // fails
todos.splice(0, todos.length); // succeeds
console.log(todos);
self.forceUpdate();
}}, 'clear all'));
}
});
var todoList = rce(TodoList, {todos: ['walk dog', 'feed cat', 'water flowers']});
ReactDOM.render(todoList, document.getElementById('react-app'));
</script>
</body>
</html>
我相信上面的代碼侵犯了許多好的做法,但顯然很容易修改props
。我知道這是因爲Object.freeze
在props
對象上被調用,而不是在它的屬性上調用,因此它不會凍結(或凍結)拼接(或更改道具對象的屬性值)。我的問題是:
- 上面的代碼應該如何寫出尊重ReactJS哲學?
- 如果不修改道具是ReactJS哲學的核心原則,爲什麼它沒有更嚴格地執行?