如何从重组转换为挂钩?

Dar*_*ron 5 javascript reactjs react-native recompose react-hooks

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

我知道withState变成useState,例如:

withState('something', 'setSomething', null)
Run Code Online (Sandbox Code Playgroud)

变成

const [something, setSomething] = useState(null);
Run Code Online (Sandbox Code Playgroud)

会是什么withPropswithHandlerscomposehoistStaticslifecycle改变?

怎么会mapStateToPropsmapDispatchToProps工作?

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);

Run Code Online (Sandbox Code Playgroud)

Eda*_*rit 5

引用丹·阿布拉莫夫:

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

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

withProps -可以在组件内部替换为const

withHandlers -可以替换为组件内部的箭头功能

lifecycle- /sf/answers/3885176711/

一个简单的示例(并非所有情况都如此):

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')
    }
  })
);
Run Code Online (Sandbox Code Playgroud)

挂钩

const MyComponent = props => {
  const [something, setSomthing] = useState(null)

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

  const myProp = props.myProp

  const myFunction = () => {
    console.log(`I need help`);
  }
}
Run Code Online (Sandbox Code Playgroud)


est*_*e97 3

你说得对,withState可以替换成useState

对于 Redux 部分,React 建议继续以与使用 API 相同的方式使用 API,但您应该将其从compose. 在react-reduxv7 中,将为此实现一个新的钩子。

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

前:

withHandlers({
    myFunc() => () => {console.log('hello')}
})
Run Code Online (Sandbox Code Playgroud)

现在:

const myFunc = () => {console.log('hello')}
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点是,componentDidMount需要componendDidUpdate将其替换为useEffect。这里需要一些阅读来理解它是如何工作的,但这并不难。您将创建的效果基本上是运行每个渲染的函数,如果您希望仅在某些内容发生更改时运行,则可以传递第二个参数,类似于 ;componentDidUpdate如果您只想运行一次,则可以传递一个空数组(类似于 )componentDidMount。不要将效果视为生命周期事件的替代,但您可以获得相同的结果。看看这篇文章我发现它非常有用。

我发现几乎没有其他可用的钩子useContextuseCallback而且useReducer非常好用。