我真的对在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
未更改。
对我来说,它看起来像一个不可变的对象。我错了吗?
有人向我解释为什么我们永远不直接写国家? 抱歉我的假问题。我正在尝试理由,但我不知道为什么......
答案 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)
要理解为什么我们想要总是返回一个新对象,你必须在函数式编程中理解纯函数和副作用。
纯函数将参数作为输入数据,返回数据或函数作为输出。这允许我们不改变输入,而是从输入中产生新数据。
通过这种方式,原始状态将保持不变,而是将被一个全新的状态对象替换,保持您的函数纯净,而不会产生副作用。