React 中 useEffect

React 中 useEffect 是副作用函数,副作用函数通常是处理外围系统交互的逻辑。那么 useEffect 是怎处理的呢?React 组件都是纯函数,需要将副作用的逻辑通过副作用函数抽离出去,也就是副作用函数是不影响函数组件的返回值的。例如,我们要获取用户列表,副作用函数去服务器获取数据,数据获取成功之后,更新 State 并发起渲染,他对函数式组件没有影响。根据以上逻辑,对应 React Render/Commit 两阶段,副作用函数函数要在 commit 式在去执行。

我们看一个简单的 useEffect 例子,在 React 中是如何处理的。

function App() {

  const [name, setName] = useState("123")
  const input = useRef()
  
  useEffect(()=>{
    console.log(name)
  }, [name])


  const handleClick = ()=>{
    setName(input.current.value)
  }
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <input ref={input}></input>
        <button onClick={handleClick}>abcd</button>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          
          Learn React
        </a>
      </header>
    </div>
  );
}

跟踪 React 代码,我们可以到 React 在 commit 阶段执行 effect。

进入 scheduleCallback 并创建调度任务

commit 结束后,workloop 执行 effect。

总结

useEffect 将函数式组件副作用于组件逻辑进行分离,commit 阶段结束后进行执行。

相关推荐
橙子味冰可乐1 小时前
isprintable()方法——判断字符是否为可打印字符
java·前端·javascript·数据库·python
奋斗吧程序媛3 小时前
使用vue动态给同一个a标签添加内容 并给a标签设置hover,悬浮文字变色,结果鼠标悬浮有的字上面不变色
前端·javascript·vue.js
王天平·Jason Wong5 小时前
vue3弹窗usehook
前端·javascript·vue.js
小跳不会Coding6 小时前
vue开发网站--关于window.print()调取打印
前端·javascript·vue.js
Lily.C7 小时前
【JavaScript 小工具】——获取富文本中的`<a>`标签 中的href值以及a标签中的内容
开发语言·javascript
下雪天的夏风8 小时前
React@16.x(43)路由v5.x(8)常见应用场景(5)- 滚动条复位
前端·javascript·react.js
苦逼的猿宝8 小时前
重温react-08(createContext使用方式)
前端·javascript·vue.js·react.js·前端框架
Amore05258 小时前
React+TS前台项目实战(二十一)-- Search业务组件封装实现全局搜索
前端·react.js·typescript·前端框架
罗_三金8 小时前
微信小程序根据蓝牙RSSI信号强度测试设备距离
前端·javascript·微信小程序·小程序
这个一个非常哈9 小时前
表单长时间无响应,页面失效提示
前端·javascript·vue.js