首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从recompose转换为hooks?

如何从recompose转换为hooks?
EN

Stack Overflow用户
提问于 2019-04-02 09:05:28
回答 2查看 3.9K关注 0票数 6

我的公司使用recompose作为我们的状态管理工具。我们正在重构我们的应用程序以使用钩子。对于下面的代码,您将如何用react钩子组件替换recompose组件?

我知道withState变成了useState,比如:

代码语言:javascript
复制
withState('something', 'setSomething', null)

变成了

代码语言:javascript
复制
const [something, setSomething] = useState(null);

withPropswithHandlerscomposehoistStaticslifecycle将更改为什么?

mapStateToPropsmapDispatchToProps是如何工作的?

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2019-04-04 03:45:54

引用丹·阿布拉莫夫的话:

为了提高工作效率,你需要“思考效果”,他们的心理模型更接近于实现同步,而不是响应生命周期事件。

我们不能1:1替换钩子和hocs,因为它们是不同的编程模型。不过,我们可以尝试通过以下方式进行迁移:

withProps -可以替换为组件内的常量

withHandlers -可以替换为组件内的箭头函数

lifecycle - https://stackoverflow.com/a/55502524/3439101

一个简单的例子(不是所有的情况):

使用hocs

代码语言:javascript
复制
const enhancer = compose(
  withProps(props => ({
    myProp: props.myProp,
  })),
  withState('something', 'setSomething', null),
  withHandlers({
    myFunction: () => () => {
      console.log(`I need help`);
    }
  }),
  lifecycle({
    componentDidMount() {
      console.log('mounted')
    }
  })
);

使用钩子

代码语言:javascript
复制
const MyComponent = props => {
  const [something, setSomthing] = useState(null)

  useEffect(() => {
    console.log('mounted')
  }, [])

  const myProp = props.myProp

  const myFunction = () => {
    console.log(`I need help`);
  }
}
票数 7
EN

Stack Overflow用户

发布于 2019-04-02 10:01:36

你说得对,useState可以取代withState

对于Redux部分,React建议继续以你一直使用的方式使用API,但你应该从compose中删除它。在react-redux v7中,将为此实现一个新的挂钩。

现在withHandlers,可以替换为普通的javascript函数,添加到您的组件或任何其他文件

之前:

代码语言:javascript
复制
withHandlers({
    myFunc() => () => {console.log('hello')}
})

现在:

代码语言:javascript
复制
const myFunc = () => {console.log('hello')}

最后但并非最不重要的一点是,componentDidMountcomponendDidUpdate将需要替换为useEffect。这里将会有一些阅读来理解它是如何工作的,但这并不难。你将创建的效果基本上是运行每个单独渲染的函数,如果你想只在某些东西发生变化时运行,你可以传递第二个参数,类似于componentDidUpdate,或者如果你想只运行一次类似于componentDidMount的空数组。不要将效果视为生命周期事件的替换,但您可以获得相同的结果。看一看this article,我发现它很有用。

有几个其他的钩子可用,我发现useContextuseCallbackuseReducer非常好用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55465538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档