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

React重写组件WillReceiveProps in use效果

白浩气
2023-03-14

所以我正在重写一个带有钩子的组件,我遇到了一个有趣的挑战,我需要用use效应钩子模仿组件WillReceiveProps的一些旧行为。

我的旧代码如下所示:

componentWillReceiveProps(nextProps: Props) {

  const prevLateVal = get(`lateMinutes[${bookingId}].value`, this.props);
  const nextLateVal = get(`lateMinutes[${bookingId}].value`, nextProps); //see here, 
//we use next props

  if (typeof nextLateVal !== 'undefined' && prevLateVal !== nextLateVal) {
    client.connect(bookingId, nextLateVal === null ? 0 : nextLateVal);

  }
}

你看,我正在基于nextrops启动一个const,然后在if语句中,我基于该nextVal进行了一些检查,现在,我知道我们可以为useffect指定第二个参数,以便仅在道具更改时运行它,但是这些检查呢,如何实现类似于nextrops

共有3个答案

孙福
2023-03-14

使用当前逻辑,您希望仅在lateMinute[${bookingId}]. value更改上触发副作用:

const Component = props => {
  useEffect(() => {
    console.log('prop lateMinutes changed');
    // ...
  }, [props[`lateMinutes[${bookingId}].value`]);
  return ...
};
毋树
2023-03-14

您可以使用useRef来保存前置道具,并使用use效应在道具更改时运行,类似于以下内容:

function MyComponent(props) {

  const prevProps = useRef(props);

  useEffect(() => {
    const prevLateVal = get(`lateMinutes[${bookingId}].value`, prevProps.current);
    const nextLateVal = get(`lateMinutes[${bookingId}].value`, props);

    if (typeof nextLateVal !== 'undefined' && prevLateVal !== nextLateVal) {
      client.connect(bookingId, nextLateVal === null ? 0 : nextLateVal);
    }    

    prevProps.current = props;
  }, [props, bookingId]);

  return (<div>...</div>)
}
养翔
2023-03-14

您可以创建自定义钩子:

function usePrevious(value) {
  const ref = useRef();
  useEffect(() => {
    ref.prevLateVal = value;
  });
  return ref.prevLateVal;
}

并让它在use效应()中使用

const Component = (props) => {
    const currentLateValue = get(`lateMinutes[${bookingId}].value`, props)
    const prevLateVal = usePrevious(currentLateValue);
    useEffect(() => {
        if(prevLateVal !== currentLateValue) {
         // process here
        }
    }, [currentLateValue]) // This will be executed only if currentLateValue changes.
}
 类似资料:
  • 我有3个组件:、和。组件负责呈现,但其方式不同。 的render函数在运行时之前静态声明,如下所示: 而则处理在运行时动态接收和呈现,如下所示: 和都具有侦听器,以便在单击时更改其状态和重写器。我注意到,当单击时,它和都将被重新呈现。但是当我单击时,将只重新呈现父级,而不是。 是一个没有的功能组件,所以我不明白为什么它不能重播。有人能解释一下为什么会这样吗?我在与这个用例相关的文档中找不到任何东西

  • 本文向大家介绍React 组件转 Vue 组件的命令写法,包括了React 组件转 Vue 组件的命令写法的使用技巧和注意事项,需要的朋友参考一下 基于目前React和Vue比较火,开发react-to-vue 工具的目的是为了进一步提高组件的可复用用性,让组件复用不仅仅局限在一个框架里面 简介 对于react-to-vue工具,转化的是基本的react component,而不是全部的react

  • 我正在尝试构建一个简单的组件,它将进行一次API调用,2秒钟后将重定向到另一个页面。为此,我尝试使用react router dom中的重定向组件,但导入失败 我得到一个错误:“react router dom没有导出的成员‘重定向’。” 版本"react-router-dom":"^6.0.0-beta.0",

  • 主要内容:React 实例,React 实例,复合组件,React 实例本章节我们将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 "Hello World!" 的组件,组件名为 HelloMessage: React 实例 function HelloMessage(props) { return <h1>Hello World!</h1>; } const element = <HelloMessage />; ReactDOM.render

  • 可以这么说,一个 React 应用就是构建在 React 组件之上的。 组件有两个核心概念: props state 一个组件就是通过这两个属性的值在 render 方法里面生成这个组件对应的 HTML 结构。 注意:组件生成的 HTML 结构只能有一个单一的根节点。 props 前面也提到很多次了,props 就是组件的属性,由外部通过 JSX 属性传入设置,一旦初始设置完成,就可以认为 thi

  • 我在React路由器2.2.1中使用React 15.0.1。我将应用程序用作父组件,它呈现从路由器处理程序传递的子组件。 这是我的导航栏组件。 这些是我的路线处理程序。当用户在路由上着陆时,将对其进行身份验证检查。如果身份验证失败,它们将被重定向到登录路径。 当应用程序组件第一次挂载导航栏和子组件时,它会检查身份验证并相应地添加到导航栏的链接。成功登录后,当用户从登录路由重定向到索引路由时,子组