当前位置: 首页 > 知识库问答 >
问题:

如何从重新组合转换为挂钩?

闾丘英悟
2023-03-14

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

我理解withState变为useState,例如:

withState('something', 'setSomething', null)

变成了

const [something, setSomething] = useState(null);

使用道具的使用处理程序的组合的提升静态的生命周期的将更改为什么?

MapStateTropsmapDispatchToProps将如何工作?

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


共有2个答案

梅逸清
2023-03-14

您是对的,with state可以替换为use state

对于Redux部分,React建议继续以与您使用API相同的方式使用它,但是您应该从comals中删除此内容。在react-redux v7中,将为此实现一个新的钩子。

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

之前:

withHandlers({
    myFunc() => () => {console.log('hello')}
})

现在:

const myFunc = () => {console.log('hello')}

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

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

太叔鸿
2023-03-14

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

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

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

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

with Handler-可以替换为组件内部的箭头函数

生命周期-https://stackoverflow.com/a/55502524/3439101

一个简单的例子(并非所有情况下):

有飞节

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`);
  }
}
 类似资料:
  • Set似乎是一种创建具有保证唯一元素的数组的好方法,但它不提供任何获取属性的好方法,除了generator[Set].values,它以的尴尬方式调用。 如果您可以在集合上调用和类似的函数,那么这是可以的。但你也不能那样做。 我尝试过,但似乎只转换了类数组(NodeList和TypedArrays?)对象设置为数组。再试一次:对Sets不起作用,set.prototype没有类似的静态方法。 那么

  • 如何将集合转换为数组?给出了三个关于将集合转换为数组的答案,这些答案目前都无法在Chrome浏览器中使用。 假设我有一个简单的集合 我可以迭代我的变量并将元素添加到一个空数组中 但是,还有其他更广泛的浏览器支持的方法吗?

  • 所以我试图生成一个数组,其中填充了唯一的随机整数,我发现用arraylist来实现这一点是最有效的方法。 现在我试着使用但我不太确定括号里应该放什么,也不确定这是否真的能起作用。有没有其他转换方法,因为我不能简单地通过。

  • 我有一个列表,我试图映射到一个二维数组[][]使用推土机和自定义转换器。 转换器只能用于在

  • 这就是我的目标: 如何进行转换,从而得到一个只有值的数组:

  • 主要内容:之前的旧方法,Java11 的 新方法,Java11 集合转换为数组 的示例Java 11 引入了一种将集合转换为数组的简单方法。 之前的旧方法 Java11 的 新方法 Java11 集合转换为数组 的示例 ApiTester.java 输出结果为