Это простая репликация проблемы, с которой я сталкиваюсь в реальном приложении.https://jsfiddle.net/zqb7mf61/
Обычно, если вы нажмете кнопку «Обновить Todo», текст изменится с «Чистая комната» на «Получить молоко». «Чистая комната» - это значение в исходном состоянии редуктораЗатем в моем React Component я на самом деле пытаюсь клонировать состояние и мутировать клон, чтобы изменить значение на «Get Milk» (Строка 35/36). Удивительно, но само исходное состояние также мутировало, хотя я стараюсь не мутироватьэто (как видно в строке 13).
Мне интересно, почему Object.assign не работает для приставки.
Вот коды из jsFiddle.
REDUX
const initState = {
task: {id: 1, text: 'Clean Room'}
}
// REDUCER
function todoReducer (state = initState, action) {
switch (action.type) {
case 'UPDATE_TODO':
console.log(state)
let newTodo = Object.assign({}, state) // here i'm trying to not make any changes. But i am surpise that state is already mutated.
return newTodo
default:
return state;
}
}
// ACTION CREATORS:
function updateTodo () {
return {type: 'UPDATE_TODO'};
}
// Create Store
var todoStore = Redux.createStore(todoReducer);
РЕАКЦИОННЫЙ КОМПОНЕНТ
//REACT COMPONENT
class App extends React.Component{
_onSubmit = (e)=> {
e.preventDefault();
let newTodos = Object.assign({}, this.props.todos) // here i clone the redux state so that it will not be mutated, but i am surprise that it is mutated and affected the reducer.
newTodos.task.text = 'Get Milk'
console.log(this.props.todos)
this.props.updateTodo();
}
render(){
return (
<div>
<h3>Todo List:</h3>
<p> {this.props.todos.task.text} </p>
<form onSubmit={this._onSubmit} ref='form'>
<input type='submit' value='Update Todo' />
</form>
</div>
);
}
}
// Map state and dispatch to props
function mapStateToProps (state) {
return {
todos: state
};
}
function mapDispatchToProps (dispatch) {
return Redux.bindActionCreators({
updateTodo: updateTodo
}, dispatch);
}
// CONNECT TO REDUX STORE
var AppContainer = ReactRedux.connect(mapStateToProps, mapDispatchToProps)(App);