欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

示例詳解react中useState的用法

 更新時間:2021年06月04日 12:01:53   作者:大蓮芒  
useState 通過在函數(shù)組件里調(diào)用它來給組件添加一些內(nèi)部 state,React 會在重復渲染時保留這個 state,接下來通過一個示例來看看怎么使用 useState吧

useState

useState 通過在函數(shù)組件里調(diào)用它來給組件添加一些內(nèi)部 state。React 會在重復渲染時保留這個 state。useState
會返回一對值:當前狀態(tài)和一個讓你更新它的函數(shù),你可以在事件處理函數(shù)中或其他一些地方調(diào)用這個函數(shù)。它類似 class 組件的
this.setState,但是它不會把新的 state 和舊的 state 進行合并。

接下來通過一個示例來看看怎么使用 useState。

有這么一個需求:需要在 iframe 中加載外部網(wǎng)頁。

初始的代碼我們通過 函數(shù)式組件 來實現(xiàn)這個需求,只需要簡單的渲染一個 iframe

import React, { useState } from 'react';

import styles from './index.less';

function Link(props) {
  const { match: { params: { link = '' } = {} } = {} } = props;
  const enCodeUrl = decodeURIComponent(link);
  const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`;
  return (
    <React.Fragment>
        <iframe
          title={link}
          src={url}
          style={{ width: '100%', height: '100%', verticalAlign: 'top' }}
          frameBorder="0"
        />
    </React.Fragment>
  );
}

export default Link;

新的需求來了,我們需要給頁面添加一個 loading 效果,實現(xiàn)的方式很簡單,監(jiān)聽 iframe 的 load 事件 來設置loading的開始和結束。

為了實現(xiàn)這個需求,我們需要存放loading的狀態(tài),而函數(shù)式組件是沒有自有狀態(tài)的,我們得改造成 class 組件:

import React from 'react';
import { Spin } from 'antd';

import styles from './index.less';

export default class Link extends React.Component {
  state = {
    // 存放loading狀態(tài)
    iLoading: true,
  };

  linkLoad() {
    // 更新loading
    this.setState({ iLoading: false });
  }

  render() {
    const { match: { params: { link = '' } = {} } = {} } = this.props;
    const { iLoading } = this.state;
    const enCodeUrl = decodeURIComponent(link);
    const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`;
    return (
      <React.Fragment>
        <Spin spinning={iLoading} wrapperClassName={styles['iframe-loading']}>
          <iframe
            onLoad={this.linkLoad.bind(this)}
            title={link}
            src={url}
            style={{ width: '100%', height: '100%', verticalAlign: 'top' }}
            frameBorder="0"
          />
        </Spin>
      </React.Fragment>
    );
  }
}

為了實現(xiàn)一個頁面的loading,我們需要去使用class,同時還需要bind綁定this等繁瑣行為,這只是一個簡單的需求,而我們卻可以通過hooks來解決這些問題,同時還能解決組件間狀態(tài)復用的問題,我們使用useState來實現(xiàn)

導入 useState
import React, { useState } from 'react';
定義狀態(tài)
  // useState 的參數(shù)為狀態(tài)初始值,setInitLoading為變更狀態(tài)值的方法
  const [initLoading, setInitLoading] = useState(true);
更新狀態(tài)
onLoad={() => setInitLoading(false)}
完整代碼如下:

import React, { useState } from 'react';
import { Spin } from 'hzero-ui';

import styles from './index.less';

function Link(props) {
  const { match: { params: { link = '' } = {} } = {} } = props;
  const [initLoading, setInitLoading] = useState(true);
  const enCodeUrl = decodeURIComponent(link);
  const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`;
  return (
    <React.Fragment>
      <Spin spinning={initLoading} wrapperClassName={styles['iframe-loading']}>
        <iframe
          onLoad={() => setInitLoading(false)}
          title={link}
          src={url}
          style={{ width: '100%', height: '100%', verticalAlign: 'top' }}
          frameBorder="0"
        />
      </Spin>
    </React.Fragment>
  );
}

export default Link;

下面看看useState注意事項

useState 的參數(shù)

useState 的參數(shù)可以是基本類型,也可以是對象類型,在更新對象類型時,切記要合并舊的狀態(tài),否則舊的狀態(tài)會丟失

const [params, setParams] = useState({
  rotate: 0,
  color: "#000000"
});

const handleInputChange = event => {
  const target = event.target;
  setParams({
    ...params,
    [target.name]: target.value
  });
};

狀態(tài)依賴

如果當前的狀態(tài)需要根據(jù)最后一次更新的狀態(tài)的值計算出來,則給更新狀態(tài)的函數(shù)傳遞一個函數(shù),此函數(shù)的第一個參數(shù)即為最后一次更新的值,然后把計算后的結果做為返回值返回出去。

總結

利用 useState hook 可以讓函數(shù)式組件擁有狀態(tài)管理特性,它與傳統(tǒng)的 class 組件的狀態(tài)管理類似,但是更加簡潔,不用頻繁的使用 this。在后面的文章中將會介紹到如何結合其他的 hooks 對業(yè)務邏輯進行抽離以使組件代碼和 hooks 代碼各司其職。

相關文章

  • React hooks使用方法全面匯總

    React hooks使用方法全面匯總

    這篇文章主要介紹了react hooks實現(xiàn)原理,文中給大家介紹了useState dispatch函數(shù)如何與其使用的Function Component進行綁定,實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • React路由中的redux和redux知識點拓展

    React路由中的redux和redux知識點拓展

    這篇文章主要介紹了React路由中的redux和redux知識點拓展,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的朋友可以參考學習一下
    2022-08-08
  • react實現(xiàn)動態(tài)表單

    react實現(xiàn)動態(tài)表單

    這篇文章主要為大家詳細介紹了react實現(xiàn)動態(tài)表單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React重新渲染超詳細講解

    React重新渲染超詳細講解

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你對這些問題還不是很明白,那么可以在這篇文章中找到答案
    2022-11-11
  • 詳細分析React 表單與事件

    詳細分析React 表單與事件

    這篇文章主要介紹了React 表單與事件的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • React實現(xiàn)全局組件的Toast輕提示效果

    React實現(xiàn)全局組件的Toast輕提示效果

    這篇文章主要介紹了React實現(xiàn)全局組件的Toast輕提示效果,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 基于React實現(xiàn)搜索GitHub用戶功能

    基于React實現(xiàn)搜索GitHub用戶功能

    在本篇博客中,我們將介紹如何在 React 應用中搜索 GitHub 用戶并顯示他們的信息,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • React文件名和目錄規(guī)范最佳實踐記錄(總結篇)

    React文件名和目錄規(guī)范最佳實踐記錄(總結篇)

    React在使用時非常靈活,如果沒有一個規(guī)范約束項目,在開發(fā)過程中會非?;靵y,本文將介紹幾個優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡述一下幾種通用的類型,用來區(qū)分文件的功能,感興趣的朋友一起看看吧
    2022-05-05
  • ReactNative實現(xiàn)的橫向滑動條效果

    ReactNative實現(xiàn)的橫向滑動條效果

    本文介紹了ReactNative實現(xiàn)的橫向滑動條效果,本文結合示例代碼給大家介紹的非常詳細,補充介紹了ReactNative基于寬度變化實現(xiàn)的動畫效果,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • React 數(shù)據(jù)獲取條件競爭原理解析

    React 數(shù)據(jù)獲取條件競爭原理解析

    這篇文章主要為大家介紹了React 數(shù)據(jù)獲取條件競爭原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論