作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有React/Redux的老传统方式:(如果你熟悉的话就不需要扩展代码了:)
import React from 'react';
import { connect } from 'react-redux';
function Count(props) {
return (
<div>
<button onClick={props.increment}> + </button>
{props.count}
<button onClick={props.decrement}> - </button>
</div>
);
}
const mapStateToProps = state => ({
count: state.count
});
const mapDispatchToProps = dispatch => ({
increment: () => dispatch({ type: 'INCREMENT' }),
decrement: () => dispatch({ type: 'DECREMENT' })
});
export default connect(mapStateToProps, mapDispatchToProps)(Count);
现在,使用 React Hooks useSelector()
和 useDispatch()
,上面的代码可以写成这样:
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
function Count() {
const count = useSelector(state => state.count);
const dispatch = useDispatch();
const increment = () => dispatch({ type: 'INCREMENT' });
const decrement = () => dispatch({ type: 'DECREMENT' });
return (
<div>
<button onClick={increment}> + </button>
{count}
<button onClick={decrement}> - </button>
</div>
);
}
export default Count;
两个版本的工作原理完全相同,只是版本 1 对于 Count
不是高度可重用的吗?这是因为使用不同的 mapStateToProps()
和 mapDispatchToProps()
,我们可以再次使用 connect()
创建另一个 CountNoodle()
现在我们重用了 Count()
。
对于版本 2,Count()
与它使用的状态和调度是硬连接的,因此整个 Count()
完全不可重用。也就是说,它必须与特定状态和特定调度一起使用,但不能与其他任何东西一起使用。难道不是吗?那么,上面的版本 2 是否不推荐,实际上您可以使用版本 3,即不将其称为 Count()
,而是将其称为 CountNoodle()
并“连接”状态和调度,并重新使用 Count()
,这只是“演示”?
所以它可能看起来像这样:
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
// Count() actually would be in a different file and CountNoodle.js
// would import that file
function Count({count, increment, decrement}) {
return (
<div>
<button onClick={increment}> + </button>
{count}
<button onClick={decrement}> - </button>
</div>
);
}
function CountNoodle() {
const count = useSelector(state => state.countNoodle);
const dispatch = useDispatch();
const increment = () => dispatch({ type: 'INCREMENT_NOODLE' });
const decrement = () => dispatch({ type: 'DECREMENT_NOODLE' });
return <Count ...{count, increment, decrement} />;
// or return Count({count, increment, decrement});
}
export default CountNoodle;
最佳答案
我在帖子 Thoughts on React Hooks, Redux, and Separation of Concerns 中解决了这个问题和我的ReactBoston 2019 talk on "Hooks, HOCs, and Tradeoffs" .
我鼓励您阅读/观看这两篇文章,但作为总结:
关于reactjs - 使用 React Hooks 是否会大大减少代码在 React/Redux 中的重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61338218/
我是一名优秀的程序员,十分优秀!