类与函数组件和 redux-toolkit 与“vanilla”redux 是两个独立的决定,彼此之间没有任何影响。(尽管你应该知道,对于 React 的一切,推荐函数组件和钩子而不是类组件)。
我试过使用 connect(来自 redux),但我找不到一种方法将切片器中的动作和选择器“缝合”到我的组件中。
使用useDispatch
and时,文档如何“缝合”动作和选择器useSelector
?这样做,但用connect
高阶组件代替。
increment()
您发布的文档示例中的函数不仅神奇地存在,还需要从切片中导入。您可以导出整个actions
对象并使用,actions.increment
但您通常会看到导出为单个变量的操作。
从文档:
大多数情况下,您可能希望使用 ES6 解构语法将动作创建器函数提取为变量,也可能需要使用 reducer:
您的切片文件可能如下所示:
const counterSlice = createSlice( /* same as before */ );
// destructure actions and reducer from the slice (or you can access as counterSlice.actions)
const { actions, reducer } = counterSlice;
// export individual action creator functions
export const { increment, decrement, incrementByAmount } = actions;
// often the reducer is a default export, but that doesn't matter
export default reducer;
connect
is的第一个参数mapStateToProps
,您可以在其中使用选择器(内联箭头函数state => state.something
或您导入的选择器函数)从状态创建props对象。这可能看起来像:
const mapStateToProps = (state) => ({
count: state.counter.value
});
第二个参数mapDispatchToProps
是可选的。如果您将一个对象传递给您的动作创建者,您的组件将收到那些已经绑定到 的动作创建者的版本dispatch
。您将能够this.props.increment()
直接调用而不是this.props.dispatch(increment())
. 您将看到在教程中常用的这种语法connect
。
import React from "react";
import { connect } from "react-redux";
import { increment, decrement } from "./counterSlice";
class MyComponent extends React.Component {
render() {
return (
<div>
<h1>Count is {this.props.count}</h1>
<button onClick={() => this.props.increment()}>
Increment
</button>
<button onClick={() => this.props.decrement()}>
Decrement
</button>
</div>
);
}
}
const mapStateToProps = (state) => ({
count: state.counter.value
});
const mapDispatchToProps = { increment, decrement };
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);
如果您mapDispatchToProps
完全不使用参数,您的组件将接收原始dispatch
函数。你会在你导入的动作创建者上调用调度,比如this.props.dispatch(increment())
. 这种语法更类似于如何useDispatch
使用。双方connect
并useDispatch
给你访问的dispatch
功能,你可以调用该函数与你喜欢的动作生成器功能创建一个动作increment()
或decrement()
。
import React from "react";
import { connect } from "react-redux";
import { increment, decrement } from "./counterSlice";
class MyComponent extends React.Component {
render() {
return (
<div>
<h1>Count is {this.props.count}</h1>
<button onClick={() => this.props.dispatch(increment())}>
Increment
</button>
<button onClick={() => this.props.dispatch(decrement())}>
Decrement
</button>
</div>
);
}
}
const mapStateToProps = (state) => ({
count: state.counter.value
});
export default connect(mapStateToProps)(MyComponent);
完整的代码沙盒