相关疑难解决方法(0)

useState() 做双重渲染

我在函数组件中使用 useState() 并且第一次渲染调用了两次。它是正确的还是错误的?如果正确,为什么要渲染两次?setCount 也渲染组件两次。

function Example() {
  const [count, setCount] = useState(0);
  console.log("render");

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

ReactDOM.render(<Example />, document.getElementById('uu5'));
Run Code Online (Sandbox Code Playgroud)

谢谢

render reactjs react-hooks

7
推荐指数
1
解决办法
3406
查看次数

为什么使用 Hooks 的 ReactJS 组件会根据开发者控制台是否打开而呈现一次或两次?

以下代码在 codeandbox.io 网站的控制台(该版本使用StrictMode)以及下面的代码段(使用StrictMode)中打印出相同的时间两次:

const { useState, useEffect } = React;

function useCurrentTime() {
  const [timeString, setTimeString] = useState("");

  useEffect(() => {
    const intervalID = setInterval(() => {
      setTimeString(new Date().toLocaleTimeString());
    }, 100);
    return () => clearInterval(intervalID);
  }, []);

  return timeString;
}

function App() {
  const s = useCurrentTime();
  console.log(s);

  return <div className="App">{s}</div>;
}

ReactDOM.render(<App />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.development.js"></script>
Run Code Online (Sandbox Code Playgroud)

演示:https : //codesandbox.io/s/gallant-bas-3lq5w?file=/ src/ App.js(使用StrictMode

这是使用生产库的片段;它仍然记录两次:

javascript reactjs codesandbox react-hooks

6
推荐指数
1
解决办法
111
查看次数

反应自定义钩子批量更新

据我了解,useState 钩子的更新函数应该批量运行,而不是每次调用时都重新渲染组件。我创建了以下自定义钩子:

function useObservable(source) {
  const [v, setV] = useState();

  useEffect(() => {
    const subscription = source.subscribe(setV);

    return () => subscription.unsubscribe();
  }, [source]);

  return v;
}
Run Code Online (Sandbox Code Playgroud)

但是当我多次使用它时,每次发射都会导致重新渲染:

const subject = new Subject();

setTimeout(() => {
  subject.next("Value");
}, 1000);

function App() {
  const value = useObservable(subject);
  const value2 = useObservable(subject);
  const value3 = useObservable(subject);

  console.log("render"); <=== called 3 times

  return (
    <div>
      <p>{value}</p>
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

有没有办法优化这个?我是不是误解了什么?

reactjs

5
推荐指数
1
解决办法
169
查看次数

反应严格模式

我正在处理我的项目,我注意到当打开严格模式时,它会将两个相同的元素推入我的数组中。当严格模式关闭时,它仅将一个元素推入数组。有什么解释为什么会发生这种情况吗?

import {getRandomNumber} from './utils';


export function registerTicket() {
    const newTicket = {
        number: getRandomNumber(),
        color: 'red',
    }
    this.setState((prevState) => {
        prevState.tickets.push(newTicket);
        return {
            remainingTickets: --prevState.remainingTickets,
            tickets: prevState.tickets,

        }
    })
}
Run Code Online (Sandbox Code Playgroud)

这是我的状态。

    this.state = {
      winningNumber: getRandomNumber(),
      remainingTickets: 5,
      tickets: [],
      finished: false
    };
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-strictmode

2
推荐指数
1
解决办法
500
查看次数