我的公司正在使用recompose作为我们的状态管理工具。我们正在重构我们的应用程序以使用钩子。对于以下代码,如何用react hook组件替换重组组件?
我知道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);
答案 0 :(得分:2)
是的,withState
可以替换为useState
。
对于Redux部分,React建议以与使用API相同的方式继续使用该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
非常好用。
答案 1 :(得分:2)
引用Dan Abramov:
要提高工作效率,您需要“思考效果”,他们的思想 该模型比实现响应更接近于实现同步 生命周期事件。
我们不能替换1:1的钩子和hocs,因为它们是不同的编程模型。 不过,我们可以尝试通过以下方式进行迁移:
withProps
-可以在组件内部替换为const
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`);
}
}