我的公司使用recompose作为我们的状态管理工具。我们正在重构我们的应用程序以使用钩子。对于下面的代码,您将如何用react钩子组件替换recompose组件?
我知道withState变成了useState,比如:
withState('something', 'setSomething', null)变成了
const [something, setSomething] = useState(null);withProps、withHandlers、compose、hoistStatics和lifecycle将更改为什么?
mapStateToProps和mapDispatchToProps是如何工作的?
import { compose, hoistStatics, withHandlers, withState, withProps, lifecycle } from 'recompose';
import { connect } from 'react-redux'
import myComponent from './myComponent'
const mapStateToProps = (state, props) => {
return {
}
};
const mapDispatchToProps = (dispatch) => {
return bindActionCreators({
}, dispatch)
};
const enhancer = compose(
connect(mapStateToProps,mapDispatchToProps),
withProps(props => ({
myProp: props.myProp,
})),
withState('something', 'setSomething', null),
withState('somethingElse', 'setSomethingElse', null),
withHandlers({
myFunction: () => () => {
console.log(`I need help`);
}
}),
lifecycle({
componentDidMount() {
},
componentDidUpdate() {
}
})
);
export default hoistStatics(enhancer)(myComponent);发布于 2019-04-04 03:45:54
引用丹·阿布拉莫夫的话:
为了提高工作效率,你需要“思考效果”,他们的心理模型更接近于实现同步,而不是响应生命周期事件。
我们不能1:1替换钩子和hocs,因为它们是不同的编程模型。不过,我们可以尝试通过以下方式进行迁移:
withProps -可以替换为组件内的常量
withHandlers -可以替换为组件内的箭头函数
lifecycle - https://stackoverflow.com/a/55502524/3439101
一个简单的例子(不是所有的情况):
使用hocs
const enhancer = compose(
withProps(props => ({
myProp: props.myProp,
})),
withState('something', 'setSomething', null),
withHandlers({
myFunction: () => () => {
console.log(`I need help`);
}
}),
lifecycle({
componentDidMount() {
console.log('mounted')
}
})
);使用钩子
const MyComponent = props => {
const [something, setSomthing] = useState(null)
useEffect(() => {
console.log('mounted')
}, [])
const myProp = props.myProp
const myFunction = () => {
console.log(`I need help`);
}
}发布于 2019-04-02 10:01:36
你说得对,useState可以取代withState。
对于Redux部分,React建议继续以你一直使用的方式使用API,但你应该从compose中删除它。在react-redux v7中,将为此实现一个新的挂钩。
现在withHandlers,可以替换为普通的javascript函数,添加到您的组件或任何其他文件
之前:
withHandlers({
myFunc() => () => {console.log('hello')}
})现在:
const myFunc = () => {console.log('hello')}最后但并非最不重要的一点是,componentDidMount和componendDidUpdate将需要替换为useEffect。这里将会有一些阅读来理解它是如何工作的,但这并不难。你将创建的效果基本上是运行每个单独渲染的函数,如果你想只在某些东西发生变化时运行,你可以传递第二个参数,类似于componentDidUpdate,或者如果你想只运行一次类似于componentDidMount的空数组。不要将效果视为生命周期事件的替换,但您可以获得相同的结果。看一看this article,我发现它很有用。
有几个其他的钩子可用,我发现useContext,useCallback和useReducer非常好用。
https://stackoverflow.com/questions/55465538
复制相似问题