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

反应:如何使用函数usestate/useffect复制特定组件类setstate回调示例?

侯善
2023-03-14

我试图转换一个简单的React组件与一个this.setstate回调到一个功能组件与useState/使用效果,但我不能复制相同的功能与后者。

我正在使用一个简单警报/通知系统的示例来在超时后追加和删除警报。沙箱:

https://codesandbox.io/s/class-and-function-callback-comparison-54tus?file=/src/index.js

相关比较代码:

const NoticesWithFunctionCallback = () => {
  const [state, setState] = useState({
    alerts: [],
    show: false
  });

  const addNotice = (e) => {
    setState({
      alerts: [...state.alerts, ""]
    });
  };

  useEffect(() => {
    (async () => {
      await timeout(3000);
      console.log("timeout occurred");
      const newAlerts = tail([...state.alerts]);
      setState({
        alerts: newAlerts
      });
    })();
  }, [state.alerts]);

  return (
    <div className="App">
      <h3>
        Notices using function component with UseState and UseEffect callback
      </h3>
      <Generator addNotice={addNotice} />
      <Container>
        {state.alerts.map((item, index) => (
          <Alert>some alert here</Alert>
        ))}
      </Container>
    </div>
  );
};

class NoticesWithClassCallback extends React.Component {
  state = {
    alerts: [],
    show: false
  };

  addNotice = (e) => {
    this.setState(
      {
        alerts: [...this.state.alerts, ""]
      },
      async () => {
        await timeout(3000);
        console.log("timeout occurred");
        const newAlerts = tail([...this.state.alerts]);
        this.setState({
          alerts: newAlerts
        });
      }
    );
  };

  render() {
    return (
      <div className="App">
        <h3>Notices using class component and setState callback</h3>
        <Generator addNotice={this.addNotice} />
        <Container>
          {this.state.alerts.map((item, index) => (
            <Alert>some alert here</Alert>
          ))}
        </Container>
      </div>
    );
  }
}

我希望得到关于如何使用usestate/useffect将正确运行的类组件setstate回调组件替换为函数组件的建议。

欢迎任何建议。

共有2个答案

澹台正真
2023-03-14

从类到功能组件有一些步骤:

步骤1:

class NameOfComponent extends Component

变成

function NameOfComponent(props){

步骤2:删除构造函数

第三步:去掉渲染()方法,保留返回

第四步。在所有方法之前添加const

步骤5:删除整个组件中的此状态

步骤6.删除整个组件中对this的所有引用

步骤7:设置初始状态与useState()(并导入它从反应)

数字示例:

const [count, setCount] = useState(0) // the useState() param is the initial value

对象的示例:

const [form, setValues] = useState({
 id: 0,
 first: ‘’,
 last: ‘’,
 password: ‘’,
 subscribe: false
})

步骤8:-通过您定义的setter更改this.setState()(例如步骤7中的setValues或setCount)

this.set状态({计数:this.state.count1)}将成为setCount(计数1)

步骤9:将componentDidMount替换为useffect

useEffect(() => {
 fetch(‘url’)
 .then(res => res.json())
 .then(items => setSomething(items)
 .catch(console.log(err))
}, [])

步骤10:替换componentDidUpdate,否则componentWillReceiveProps将使用useEffect

useEffect(() => {
     console.log(myPropsToCheck+ " has changed ! ")
    }, [myPropsToCheck])
})
翁良弼
2023-03-14

在这里没有使用的必要。每次更改警报阵列时都会触发useEffect:通过向其中添加项以及删除项。它也会在初始化后立即触发,所以事情会变得一团糟。相反,您应该修改addNotice函数并使用前一个函数更新状态,如下所示:

const NoticesWithFunctionCallback = () => {
  const [state, setState] = useState({
    alerts: [],
    show: false
  });

  const addNotice = (e) => {
    setState({
      ...state,
      alerts: [...state.alerts, '']
    });
    (async () => {
      await timeout(3000);
      setState(prevState => {
        return {
          ...prevState,
          alerts: [...tail([...prevState.alerts])]
        }
      });
    })()
  };

  return (
    <div className="App">
      <h3>
        Notices using function component with UseState and UseEffect callback
      </h3>
      <p>I want this to replicate the class component but its broken...</p>
      <Generator addNotice={addNotice} />
      <Container>
        {state.alerts.map((item, index) => (
          <Alert key={index}>Alert</Alert>
        ))}
      </Container>
    </div>
  );
};
 类似资料:
  • 我一直在试图理解什么时候取消订阅(在use效应中的回调)会被准确地调用。 这是代码笔链接:https://codepen.io/deen_john/pen/eYmNdMy代码: 问题:在我的例子中,使用效果钩子中的回调函数(即取消订阅),每次我点击按钮时都会被调用(即每次我更新按钮状态)。但是,根据React留档,use效应中的回调工作类似于组件WillUnMount生命周期,所以在我的例子中,它

  • 我正在使用useState设置文本输入,我正在使用use效应覆盖后退按钮的行为。 这总是导致记录的文本成为useState的初始值。如果我不使用useEffect,它可以工作,但我不想在每次更改时都设置导航选项。我可以从useEffect中的useState获取当前值,还是需要其他解决方案?

  • 我正在尝试使用react钩子创建一个悬停以显示div,我遇到了以下问题: 第69:31行:在函数“renderHideOptionalClauseTrigger”中调用React钩子“useState”,该函数既不是React函数组件,也不是自定义React钩子函数React钩子/钩子规则 搜索关键字以了解有关每个错误的更多信息。 以下是我的代码库:

  • 我在学反应。我读过一篇文章,建议我们使用函数组件,而不是扩展react.component的类,所以我跟着做了。我也使用箭头函数而不是函数关键字。即: 有没有一种方法可以使用setState()来代替setName()、setId()、…等?或者任何建议? 非常感谢!

  • 我在问之前找了很多,但似乎找不到一个适合我的解决方案。 我有一个函数,我需要在状态设置为新值后调用。 即使该函数是作为setState回调调用的,它仍然获得旧值。

  • 我在TypeScript中有一个React组件,看起来像这样: 我希望能够指定我的propTypes()中的函数使用对象,但我不知道怎么做。