【发布时间】:2021-10-02 14:22:14
【问题描述】:
我们知道,如果我们想重新渲染一个由 react-redux 连接的 react 组件,我们应该在派发相关动作时在 reducer 中返回一个新数组。我的问题是,为什么当 redux reducer 不返回新数组时,react 组件可以重新渲染? 当我点击应用组件按钮时,第一个应用名称变成'aaa',为什么???
行动:
export function setAppName(name: string) {
return {
type: 'SET_APP_NAME',
name,
}
}
减速器:
export function appInfos(state = {
appInfos: [
{name: 'ccc'},
{name: 'ddd'},
]
}, action: any) {
switch(action.type) {
case 'SET_APP_NAME':
// just return origin array, not a new array
const appInfos = state.appInfos;
appInfos[0].name = action.name
return Object.assign({}, state, { appInfos })
default:
return state;
}
}
组件应用:
function mapStateToProps(state: any) {
return {
app: state.appInfos
}
}
function App() {
const { app } = useSelector(mapStateToProps)
const dispatch = useDispatch()
const onClick = useCallback(() => {
dispatch(setAppName('aaa'))
}, [dispatch])
return (
<div className="app">
{app.appInfos.map((info: any) => {
return <div key={info.name}>{info.name}</div>
})}
<button onClick={onClick}>click</button>
</div>
);
}
容器和存储:
const store = createStore(combineReducers({
appInfos
}))
ReactDOM.render(
<Provider store={store}>
<React.StrictMode>
<App />
</React.StrictMode>
</Provider>,
document.getElementById('root')
);
【问题讨论】:
-
appInfos[0].name = action.name这是在改变当前状态对象。见:How to update single value inside specific array item in redux
标签: reactjs redux react-redux