Hooks基本使用

lxf2023-05-14 01:12:50
对于习惯vue和react的class 基于生命周期开发的同学来说,在开始使用Hooks的时候,总
是会把class开发和 Hooks开发进行一一的比对,希望在hooks中找到class开发对应的替代
方式,也许这种想法就是有问题的。
学习Hooks前,可以忘记你的class写法。

最简单的Hooks

class 版本的有状态组件

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
  render() {
   return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

再来看看hooks后的版本:

import React, { useState } from 'react';
function Example() {
  // 声明一个新的叫做 “count” 的 state 变量
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

声明变量:

import React, { useState } from 'react';
function Example() {
  const [count, setCount] = useState(0);
}

useState 方法作用和class的 this.state 提供的功能完全相同。 唯一参数就是初始state,返回值是一个数组,数组第一个项目是变量,第二项是的改变改值的方法。 解构出来 countsetCount 相当于class组件的 this.state.countthis.setState

一个组件有多个状态值怎么办

function ExampleWithManyStates() {
  // 声明多个 state 变量
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: '学习 Hook' }]);
}

useEffect

useEffect(createHandle, [deps])

官方解释:

该 Hook 接收一个包含命令式、且可能有副作用代码的函数。 在函数组件主体内(这里指在 React 渲染阶段)改变 DOM、添加订阅、设置定时器、记录日志以及执行其他包含副作用的操作都是不被允许的,因为这可能会产生莫名其妙的 bug 并破坏 UI 的一致性。 使用 useEffect 完成副作用操作。赋值给 useEffect 的函数会在 组件渲染到屏幕之后执行

可以注意到,useEffect的函数是在的组件渲染到DOM后执行。 useEffect的第二个参数deps, 只是createHandle 执行的 条件:

[]: 首次渲染执行
[stateA]: 变量stateA 变化才执行
[stateA, stateB]: 变量stateA 或 stateB 变化时就执行
没有值: 每次渲染后都会执行
function Example() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  }, [count]);

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

正确的应用useStateuseEffect, 能够完成很多基本的需求。 其他的Hook,可以根据需求酌情使用

参考资料 使用 Effect Hook: react.docschina.org/docs/hooks-… React技术揭秘: react.iamkasong.com/

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!