亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

使用React Hook提高代碼復(fù)用性

KevinYan / 3443人閱讀

摘要:看完代碼應(yīng)該就能很好的理解的使用了吧,具體代碼的運(yùn)行點(diǎn)擊在線演示查看在線演示總結(jié)給我們帶來的就是在函數(shù)的基礎(chǔ)上可以加入狀態(tài)和生命周期等函數(shù)不曾有的特性,這個(gè)特性的加入能夠讓我們更好的抽象組件,提高代碼的復(fù)用性。

Hook 簡(jiǎn)介

Hook 是 React 16.8 的新增特性。是對(duì) React 函數(shù)組件的一種擴(kuò)展,通過提供一些特殊的函數(shù),讓無狀態(tài)的組件擁有狀態(tài)組件才擁有的能力。

沒有Hook之前寫組件有兩種形式,分別為

函數(shù)組件

class組件

函數(shù)組件特點(diǎn)如下

所有的數(shù)據(jù)都是依賴props傳入的,沒有內(nèi)部state

沒有生命周期

沒有this(組件實(shí)例)

實(shí)際開發(fā)中因?yàn)闃I(yè)務(wù)復(fù)雜,一般使用函數(shù)組件無法滿足,所以大家默認(rèn)都是使用class組件進(jìn)行開發(fā),這是一個(gè)不會(huì)出錯(cuò)的選擇。函數(shù)組件大家平時(shí)應(yīng)該都挺少會(huì)去用的,因?yàn)楹瘮?shù)組件能提供的功能比較局限。但是引入Hook后,函數(shù)的能力就被擴(kuò)展了許多,因?yàn)楹瘮?shù)的特性,非常適合抽象成可復(fù)用的組件。

解決哪些問題 不同組件間與狀態(tài)有關(guān)的邏輯復(fù)用問題

平時(shí)寫組件的方式就是通過props傳遞給下一個(gè)組件,有些簡(jiǎn)單的情況這樣也挺好的。但是當(dāng)項(xiàng)目不斷迭代,會(huì)發(fā)現(xiàn)當(dāng)組件被多個(gè)模塊多次引用,還是會(huì)多寫一些重復(fù)的邏輯。因?yàn)槭艿降綘顟B(tài)或者生命周期的影響,導(dǎo)致這部分邏輯卻又很難拆出來。

引入Hook就可以將受狀態(tài)或生命周期影響的組件抽出來。

業(yè)務(wù)發(fā)展導(dǎo)致組件日益龐大

最外層的代碼集中維護(hù)許多state狀態(tài),導(dǎo)致頁面引入越來越多毫無關(guān)聯(lián)的模塊,代碼的可讀性大大降低,有時(shí)候因?yàn)槎鄠€(gè)生命周期里面有大量不相關(guān)的邏輯,這樣雜亂的代碼容易引起bug,也增加了其它開發(fā)人員維護(hù)的難度。

Hook將組件中每一個(gè)相關(guān)的小模塊拆分成一個(gè)函數(shù),這樣能夠讓組件即使龐大結(jié)構(gòu)也是清晰的。

用法

State Hook: 在函數(shù)組件中使用state

Effect Hook: 在函數(shù)組件中使用生命周期

Custom Hook: 自定義Hook,可以將組件邏輯提取到函數(shù)中。(注意:自定義 Hook 是一個(gè)函數(shù),其名稱以 “use” 開頭,函數(shù)內(nèi)部可以調(diào)用其他的 Hook)

Hook 規(guī)則

Hook 本質(zhì)就是 JavaScript 函數(shù),但是在使用它時(shí)需要遵循兩條規(guī)則

只在最頂層使用 Hook(不要在循環(huán),條件或嵌套函數(shù)中調(diào)用)

只在 React 函數(shù)中調(diào)用 Hook

ESLint 插件

強(qiáng)制執(zhí)行 hooks 的最佳實(shí)踐

eslint-plugin-react-hooks

如何使用

詳細(xì)的一些概念官方文檔已經(jīng)寫得很全面了,可以參考:Hook的官方文檔。

接下來就用一個(gè)實(shí)際的例子來說明一下State Hook的使用

示例

產(chǎn)品第一版本需求如下:

現(xiàn)在有 小A,小B 兩位同學(xué),每位同學(xué)都處于未穿鞋的狀態(tài),小A穿鞋需要2s,小B穿鞋需要5s,在頁面一中用文字描述兩位同學(xué)的穿鞋狀態(tài)變更( 如果小A正在穿鞋中,則在頁面上顯示 "小A正在穿鞋子",如果小A已經(jīng)穿好了鞋子,則將文字替換為 "小A已經(jīng)穿好鞋子")

使用class組件實(shí)現(xiàn)如下:

src/demo1.js

import React from "react";

class Page extends React.Component {
  state = {
    data: [
      { id: 1, name: "小A", time: "2000" },
      { id: 2, name: "小B", time: "5000" }
    ]
  };

  start(item) {
    this.setState({
      [item.id]: "穿鞋子"
    });

    setTimeout(() => {
      this.setState({
        [item.id]: "穿好鞋子"
      });
    }, item.time);
  }

  componentDidMount() {
    this.state.data.forEach(item => {
      this.start(item);
    });
  }

  render() {
    return (
      
{this.state.data.map(item => { return (

{this.state[item.id] === "穿鞋子" ? `${item.name}正在穿鞋子...` : `${item.name}已經(jīng)穿好鞋子了`}

); })}
); } } export default Page;

使用Hook組件實(shí)現(xiàn)如下:

自定義hook如下:

src/useHook.js

import React, { useState } from "react";

function useHook(item) {
  const [status, setStatus] = useState("穿鞋子");

  setTimeout(() => {
    setStatus("穿好鞋子");
  }, item.time);

  return (
    

{status === "穿鞋子" ? `${item.name}正在穿鞋子...` : `${item.name}已經(jīng)穿好鞋子了`}

); } export default useHook;

引用hook的函數(shù)組件

src/hookDemo1.js

import React from "react";
import useHook from "./useHook";

function Page() {
  const data = [
    { id: 1, name: "小A", time: "2000" },
    { id: 2, name: "小B", time: "5000" }
  ];
  return (
    
{data.map(item => { return useHook(item); })}
); } export default Page;

好了,實(shí)現(xiàn)完上面的需求,現(xiàn)在覺得hook的好處并沒有什么體現(xiàn),接下來產(chǎn)品又發(fā)布了第二版需求,要求我們?cè)诹硪粋€(gè)頁面顯示另外兩位同學(xué)的狀態(tài)。需求如下:

現(xiàn)在有 小C,小D 兩位同學(xué),每位同學(xué)都處于未穿鞋的狀態(tài),小A穿鞋需要4s,小B穿鞋需要8s,在頁面二中用文字描述兩位同學(xué)的穿鞋狀態(tài)變更( 如果小A正在穿鞋中,則在頁面上顯示 "小C正在穿鞋子",如果小C已經(jīng)穿好了鞋子,則將文字替換為 "小C已經(jīng)穿好鞋子")

接下來再第一個(gè)版本的基礎(chǔ)上來實(shí)現(xiàn)第二個(gè)需求

使用class組件實(shí)現(xiàn)如下:

src/demo2.js

import React from "react";

class Page extends React.Component {
  state = {
    data: [
      { id: 1, name: "小C", time: "4000" },
      { id: 2, name: "小D", time: "8000" }
    ]
  };

  start(item) {
    this.setState({
      [item.id]: "穿鞋子"
    });

    setTimeout(() => {
      this.setState({
        [item.id]: "穿好鞋子"
      });
    }, item.time);
  }

  componentDidMount() {
    this.state.data.forEach(item => {
      this.start(item);
    });
  }

  render() {
    return (
      
{this.state.data.map(item => { return (

{this.state[item.id] === "穿鞋子" ? `${item.name}正在穿鞋子...` : `${item.name}已經(jīng)穿好鞋子了`}

); })}
); } } export default Page;

使用Hook組件實(shí)現(xiàn)如下:

src/hookDemo2.js

import React from "react";
import useHook from "./useHook";

function Page() {
  const data = [
    { id: 1, name: "小C", time: "4000" },
    { id: 2, name: "小D", time: "8000" }
  ];
  return (
    
{data.map(item => { return useHook(item); })}
); } export default Page;

第二次的代碼明顯比第一次少了許多,而且如果之后產(chǎn)品如果增加了一個(gè)狀態(tài),那明顯使用Hook實(shí)現(xiàn)的方式可以更快的適應(yīng)需求的變更,代碼的維護(hù)性也變高了許多。

看完代碼應(yīng)該就能很好的理解hook的使用了吧,具體代碼的運(yùn)行點(diǎn)擊在線演示查看

在線演示

總結(jié)

Hook給我們帶來的就是在函數(shù)的基礎(chǔ)上可以加入狀態(tài)和生命周期等函數(shù)不曾有的特性,這個(gè)特性的加入能夠讓我們更好的抽象組件,提高代碼的復(fù)用性。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/104086.html

相關(guān)文章

  • React Hooks入門: 基礎(chǔ)

    摘要:當(dāng)組件安裝和更新時(shí),回調(diào)函數(shù)都會(huì)被調(diào)用。好在為我們提供了第二個(gè)參數(shù),如果第二個(gè)參數(shù)傳入一個(gè)數(shù)組,僅當(dāng)重新渲染時(shí)數(shù)組中的值發(fā)生改變時(shí),中的回調(diào)函數(shù)才會(huì)執(zhí)行。 前言   首先歡迎大家關(guān)注我的Github博客,也算是對(duì)我的一點(diǎn)鼓勵(lì),畢竟寫東西沒法獲得變現(xiàn),能堅(jiān)持下去也是靠的是自己的熱情和大家的鼓勵(lì),希望大家多多關(guān)注呀!React 16.8中新增了Hooks特性,并且在React官方文檔中新增...

    mrli2016 評(píng)論0 收藏0
  • React Hook 不完全指南

    摘要:使用完成副作用操作,賦值給的函數(shù)會(huì)在組件渲染到屏幕之后。如此很容易產(chǎn)生,并且導(dǎo)致邏輯不一致。同時(shí),這也是很多人將與狀態(tài)管理庫(kù)結(jié)合使用的原因之一。當(dāng)我們通過的第二個(gè)數(shù)組類型參數(shù),指明當(dāng)前的依賴,就能避免不相關(guān)的執(zhí)行開銷了。 前言 本文內(nèi)容大部分參考了 overreacted.io 博客一文,同時(shí)結(jié)合 React Hook 官方 文章,整理并歸納一些筆記和輸出個(gè)人的一些理解 什么是 Hoo...

    Lin_R 評(píng)論0 收藏0
  • React Hook起飛指南

    摘要:起飛指南作者元瀟方凳雅集出品目前放出來了個(gè)內(nèi)置,但僅僅基于以下兩個(gè),就能做很多事情。行代碼實(shí)現(xiàn)一個(gè)全局元瀟根組件掛上即可子組件調(diào)用隨時(shí)隨地實(shí)現(xiàn)一個(gè)局部元瀟的本質(zhì)是的一個(gè)語法糖,感興趣可以閱讀一下的類型定義和實(shí)現(xiàn)。 React Hook起飛指南 作者:元瀟 方凳雅集出品 16.8目前放出來了10個(gè)內(nèi)置hook,但僅僅基于以下兩個(gè)API,就能做很多事情。所以這篇文章不會(huì)講很多API,...

    姘擱『 評(píng)論0 收藏0
  • 淺談React Hooks

    摘要:另外也不利于組件的,及。所以在使用時(shí),盡量將相關(guān)聯(lián)的,會(huì)共同變化的值放入一個(gè)。有同學(xué)可能會(huì)想,每次后都會(huì)執(zhí)行,這樣會(huì)不會(huì)對(duì)性能造成影響。另外必須以開頭來命名,這樣工具才能正確檢測(cè)其是否符合規(guī)范。 由于工作的原因我已經(jīng)很長(zhǎng)時(shí)間沒接觸過React了。前段時(shí)間圈子里都在討論React Hooks,出于好奇也學(xué)習(xí)了一番,特此整理以加深理解。 緣由 在web應(yīng)用無所不能的9012年,組成應(yīng)用的C...

    yearsj 評(píng)論0 收藏0
  • React-hooks 簡(jiǎn)介

    摘要:比如在條件判斷中使用,在循環(huán),嵌套函數(shù)中使用,都會(huì)造成執(zhí)行順序不一致的問題。而比如定時(shí)器,事件監(jiān)聽。第一個(gè)參數(shù)的返回值,會(huì)在組件卸載時(shí)執(zhí)行,相當(dāng)于,可以清理定時(shí)器,移除事件監(jiān)聽,取消一些訂閱。 什么是 Hooks? 不通過編寫類組件的情況下,可以在組件內(nèi)部使用狀態(tài)(state) 和其他 React 特性(生命周期,context)的技術(shù) Hooks 為什么會(huì)出現(xiàn) 在之前的 React ...

    incredible 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<