C T*_*que 4 typescript reactjs redux
我已经看到很多关于这个标题的 SO/github 问题,而且我确信实际上 99% 的时间都没有执行导致此错误的原因:-connect wrapper 组件与 MapStateToProps 和 MapDispatchToProps,-return new State 而不是变异减速机的实际状态。
在 redux devtools 扩展中,当我调度 ADD_TODO 时,我可以看到 StoreState 随列表中的新 Todo 发生变化。当我调度 ADD_TODO 时,Body 组件不会重新渲染。如果我在 todos 初始 StoreState 中注入一个 Todo,则 Todo 将显示在 Body 组件中。
你可以在这里找到存储库
减速机:
import { TodoAction } from '../actions';
import { StoreState } from '../types/index';
import { ADD_TODO, TOGGLE_TODO } from '../constants/index';
import TodoModel from '../models/TodoModel';
export function todos(state: StoreState, action: TodoAction): StoreState {
let todos: Array<TodoModel>;
switch (action.type) {
case ADD_TODO:
todos = state.todos;
todos.unshift(action.todo);
return { ...state, todos: todos };
case TOGGLE_TODO:
todos = state.todos;
const todo = todos.find(todo => todo.id === action.todo.id);
if (todo !== undefined) {
const key = todos.indexOf(todo);
todos[key].done = true;
}
return { ...state, todos: todos };
default:
return state;
}
}
Run Code Online (Sandbox Code Playgroud)
容器组件:
export default connect(mapStateToProps, mapDispatchToProps)(Body);
import Body from '../components/Body/Body';
import { StoreState } from '../types/index';
import { connect } from 'react-redux';
export function mapStateToProps({ todos }: StoreState) {
return {
todos
};
}
export function mapDispatchToProps() {
return {
//
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Body);
Run Code Online (Sandbox Code Playgroud)
组件未由 storeState 更改更新:
import * as React from 'react';
import TodoModel from '../../models/TodoModel';
interface Props {
todos: Array<TodoModel>;
}
interface State {
}
class Body extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
}
render() {
console.log(this.props);
return (
<div>
<ul>
{this.props.todos.map(todo => <li key={todo.id}>{todo.content}</li>)}
</ul>
</div>
);
}
}
export default Body;
Run Code Online (Sandbox Code Playgroud)
unshift
改变数组,你需要返回一个新的:
case ADD_TODO:
todos = [...state.todos]; // or - state.todos.slice();
todos.unshift(action.todo);
return { ...state, todos: todos };
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2332 次 |
最近记录: |