zoukankan      html  css  js  c++  java
  • react新特性hook

    一、hook示例。
     
    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>
    );
    }
     
     
    useState 唯一的参数就是初始 state。在上面的例子中,我们的计数器是从零开始的,所以初始 state 就是 0。值得注意的是,不同于 this.state,这里的 state 不一定要是一个对象 —— 如果你有需要,它也可以是。这个初始 state 参数只有在第一次渲染时会被用到。
     
    二、声明多个 state 变量
    function ExampleWithManyStates() {
    // 声明多个 state 变量!
    const [age, setAge] = useState(42);
    const [fruit, setFruit] = useState('banana');
    const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
    // ...
    }
     
    三、Effect Hook
    你之前可能已经在 React 组件中执行过数据获取、订阅或者手动修改过 DOM。我们统一把这些操作称为“副作用”,或者简称为“作用”。
    useEffect 就是一个 Effect Hook,给函数组件增加了操作副作用的能力。它跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具有相同的用途,只不过被合并成了一个 API。(我们会在使用 Effect Hook 里展示对比 useEffect 和这些方法的例子。)
     
    四、
    import React, { useState, useEffect } from 'react';
    function Example() {
    const [count, setCount] = useState(0);
     
    // 相当于 componentDidMount 和 componentDidUpdate:
    useEffect(() => {
    // 使用浏览器的 API 更新页面标题
    document.title = `You clicked ${count} times`;
    });
     
    return (
    <div>
    <p>You clicked {count} times</p>
    <button onClick={() => setCount(count + 1)}>
    Click me
    </button>
    </div>
    );
    }
     
     
    当你调用 useEffect 时,就是在告诉 React 在完成对 DOM 的更改后运行你的“副作用”函数。由于副作用函数是在组件内声明的,所以它们可以访问到组件的 props 和 state。默认情况下,React 会在每次渲染后调用副作用函数 —— 包括第一次渲染的时候。(我们会在使用 Effect Hook 中跟 class 组件的生命周期方法做更详细的对比。)
     
    五、跟 useState 一样,你可以在组件中多次使用 useEffect :
    function FriendStatusWithCounter(props) {
    const [count, setCount] = useState(0);
    useEffect(() => {
    document.title = `You clicked ${count} times`;
    });
     
    const [isOnline, setIsOnline] = useState(null);
    useEffect(() => {
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
    ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
    });
     
    function handleStatusChange(status) {
    setIsOnline(status.isOnline);
    }
    六、Hook 使用规则
    Hook 就是 JavaScript 函数,但是使用它们会有两个额外的规则:
    * 只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用。
    * 只能在 React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(还有一个地方可以调用 Hook —— 就是自定义的 Hook 中,我们稍后会学习到。)
    七、自定义 Hook
    有时候我们会想要在组件之间重用一些状态逻辑。目前为止,有两种主流方案来解决这个问题:高阶组件和 render props。自定义 Hook 可以让你在不增加组件的情况下达到同样的目的。
    前面,我们介绍了一个叫 FriendStatus 的组件,它通过调用 useState 和 useEffect 的 Hook 来订阅一个好友的在线状态。假设我们想在另一个组件里重用这个订阅逻辑。
    首先,我们把这个逻辑抽取到一个叫做 useFriendStatus 的自定义 Hook 里:
    import React, { useState, useEffect } from 'react';
     
    function useFriendStatus(friendID) {
    const [isOnline, setIsOnline] = useState(null);
     
    function handleStatusChange(status) {
    setIsOnline(status.isOnline);
    }
     
    useEffect(() => {
    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
    return () => {
    ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
    };
    });
     
    return isOnline;
    }
    它将 friendID 作为参数,并返回该好友是否在线:
    现在我们可以在两个组件中使用它:
    function FriendStatus(props) {
    const isOnline = useFriendStatus(props.friend.id);
     
    if (isOnline === null) {
    return 'Loading...';
    }
    return isOnline ? 'Online' : 'Offline';
    }
     
     
     

  • 相关阅读:
    CKEditor 4 上传视频
    CKEditor 4 上传图片
    azure跨域问题(访问azure存储账户数据,blob)
    azure 上传blob到ams(CreateFromBlob)
    js 时间格式化成字符串
    js正则表达式替换HTML标签以及空格(&nbsp;)
    js 获取上传视频的时长、大小、后缀名
    webapi 跨域问题
    requests(二): json请求中固定键名顺序&消除键和值之间的空格
    requests(一): 发送一个json格式的post请求
  • 原文地址:https://www.cnblogs.com/qdcnbj/p/11204840.html
Copyright © 2011-2022 走看看