int*_*der 6 javascript reactjs react-hooks
TL;DR:我正在尝试使用新的react-hooksapi,但是在调用setState挂钩时我不断收到 Invariant Violation 错误,但它一直失败。
import React, { useState } from 'react';
// type State = {
// heading: string;
// }
const Text = () => {
const initialState = 'Heading'.toUpperCase();
const [heading, setHeading] = useState(initialState);
return (
<header>
<h1>
{setHeading('Brussels')};
{heading}
</h1>
</header>
);
};
export default Text;
Run Code Online (Sandbox Code Playgroud)
如果您回想一下类组件版本,您的代码正在调用this.setState,render()这将触发另一个渲染,然后this.setState再次调用,循环重复,您将收到错误:
未捕获的错误:重新渲染过多。React 限制渲染次数以防止无限循环。
您不会this.setState直接在渲染方法中调用,也不应该使用钩子来调用。
目前还不清楚你在这里想要实现什么,但我认为你想要的是只设置一次名称,你会在 中做componentDidMount,你可以使用useEffect钩子来实现这一点。
或者,如果您希望“布鲁塞尔”成为初始状态,请将其作为值传递给useState().
const {useState, useEffect} = React;
const Text = () => {
const initialState = 'Heading'.toUpperCase();
const [heading, setHeading] = useState(initialState);
useEffect(() => {
setHeading('Brussels');
}, []); // Pass in empty array to simulate componentDidMount.
return (
<header>
<h1>
{heading}
</h1>
</header>
);
};
ReactDOM.render(<Text />, document.querySelector('#app'));Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>Run Code Online (Sandbox Code Playgroud)
小智 1
调用 setHeading("Brussel") 将导致一次又一次重新渲染,从而导致无限循环,以防止您需要一个事件将标题从“Heading”更改为“Brussels”。下面的代码可能对你有帮助
const Text = () => {
const initialState= 'Heading'.toUpperCase();
const [heading, setHeading] = useState(initialState);
return (
<header>
<h1>
{heading}
<button onClick= {() =>{setHeading("Brussel")}}>ChangeName</button>
</h1>
</header>
);
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18073 次 |
| 最近记录: |