Существует несколько сообщений в 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, почему он не применяется более строго?