有人向我解释为什么我们永远不会直接写入Redux中的州?

时间:2017-05-20 07:30:28

标签: object redux immutability

我真的对在redux中使用的Object.assign()感到困惑。

我不明白为什么以下代码有效..

   05-20 12:31:55.213 2679-2679/com.example.android.foursquare_pammu 
    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.foursquare_pammu, PID: 2679
    java.lang.NullPointerException: Attempt to invoke virtual method 
    'void android.widget.TextView.setText(java.lang.CharSequence)' on a null  object reference
    at com.example.android.foursquare_pammu.adapter.VenuesAdapter.onBindViewHold
  er(VenuesAdapter.java:66)

我只是直接写入州的值,但结果是我期望的值...

import { createStore } from "redux" const userReducer = function (state={}, action) { switch (action.type) { case "CHANGE_USER_NAME": state.name = action.payload break; case "CHANGE_USER_AGE": state.age = action.payload break; default: } return state; } const store = createStore(userReducer) store.subscribe(() => console.log(store.getState())) store.dispatch({ type: "CHANGE_USER_NAME", payload: "paul" }) store.dispatch({ type: "CHANGE_USER_AGE", payload: 74 }) // It returned { name: "paul", age: 74 } store.dispatch({ type: "CHANGE_USER_NAME", payload: "john" }) // It returned { name: "john", age: 74 } changed name to "john" but age is same. This point. is not immutable object? 已更改,但user.name未更改。

对我来说,它看起来像一个不可变的对象。我错了吗?

有人向我解释为什么我们永远不直接写国家? 抱歉我的假问题。我正在尝试理由,但我不知道为什么......

2 个答案:

答案 0 :(得分:0)

const userReducer = function (state={
  name : "",
  age : ""
}, action) {
  switch (action.type) {
    case "CHANGE_USER_NAME":
      state ={
        ...state ,
        name : action.payload
      }
      break;
    case "CHANGE_USER_AGE":
      state ={
        ...state ,
        age : action.payload
      }
      break;
    default:
  }
  return state;
}

这是在状态中存储数据的正确方法,因此它不会覆盖以前的状态。

答案 1 :(得分:0)

要理解为什么我们想要总是返回一个新对象,你必须在函数式编程中理解纯函数和副作用。

纯函数将参数作为输入数据,返回数据或函数作为输出。这允许我们不改变输入,而是从输入中产生新数据。

通过这种方式,原始状态将保持不变,而是将被一个全新的状态对象替换,保持您的函数纯净,而不会产生副作用。