最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

記錄一次完整的react hooks實(shí)踐

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:00:15
文檔

記錄一次完整的react hooks實(shí)踐

記錄一次完整的react hooks實(shí)踐:寫(xiě)在前面 React在16.8版本正式發(fā)布了Hooks。關(guān)注了很久,最近正好有一個(gè)小需求,趕緊來(lái)試一下。 需求描述 需求很簡(jiǎn)單,部門(mén)內(nèi)部的一個(gè)數(shù)據(jù)查詢(xún)小工具。大致長(zhǎng)成下面這樣: 用戶(hù)首次訪(fǎng)問(wèn)頁(yè)面,會(huì)拉取數(shù)據(jù)展示。輸入篩選條件,點(diǎn)擊查詢(xún)后,會(huì)再次拉取數(shù)據(jù)在前
推薦度:
導(dǎo)讀記錄一次完整的react hooks實(shí)踐:寫(xiě)在前面 React在16.8版本正式發(fā)布了Hooks。關(guān)注了很久,最近正好有一個(gè)小需求,趕緊來(lái)試一下。 需求描述 需求很簡(jiǎn)單,部門(mén)內(nèi)部的一個(gè)數(shù)據(jù)查詢(xún)小工具。大致長(zhǎng)成下面這樣: 用戶(hù)首次訪(fǎng)問(wèn)頁(yè)面,會(huì)拉取數(shù)據(jù)展示。輸入篩選條件,點(diǎn)擊查詢(xún)后,會(huì)再次拉取數(shù)據(jù)在前

寫(xiě)在前面

React在16.8版本正式發(fā)布了Hooks。關(guān)注了很久,最近正好有一個(gè)小需求,趕緊來(lái)試一下。

需求描述

需求很簡(jiǎn)單,部門(mén)內(nèi)部的一個(gè)數(shù)據(jù)查詢(xún)小工具。大致長(zhǎng)成下面這樣:

用戶(hù)首次訪(fǎng)問(wèn)頁(yè)面,會(huì)拉取數(shù)據(jù)展示。輸入篩選條件,點(diǎn)擊查詢(xún)后,會(huì)再次拉取數(shù)據(jù)在前端展示。

需求實(shí)現(xiàn)

使用React Class Component的寫(xiě)法

如果使用以前的class寫(xiě)法,簡(jiǎn)單寫(xiě)一下,代碼可能大概長(zhǎng)成下面這樣:

import React from 'react';
import { Tabs, Input, RangeTime, Button, Table } from './components';

class App extends React.Component {
 ...
 state = {
 type: [],
 id: '',
 title: '',
 date: [],
 dataList: []
 }
 componentDidMount() {
 this.fetchData();
 }
 render() {
 <Tabs value={this.state.type} onChange={this.handleTypeChange}/>
 <Input value={this.state.id} label="ID" onChange={this.handleIdChange}/>
 <Input value={this.state.id} label="標(biāo)題" onChange={this.handleTitleChange}/>
 <RangeTime value={this.state.date} onChange={this.handleRangeTimeChange}/>
 <Button onClick={this.handleQueryBtnClick}>查詢(xún)</Button>
 <Table dataList={this.state.dataList} />
 }
 
 fetchData() {
 ...
 this.setState({
 dataList
 });
 }

 handleTypeChange() {
 ...
 this.setState({
 type,
 });
 }
 
 handleIdChange() {
 ...
 this.setState({
 id,
 });
 }

 handleTitleChange() {
 ...
 this.setState({
 title,
 });
 }

 handleRangeTimeChange() {
 ...
 this.setState({
 date,
 });
 }

 handleQueryBtnClick() {
 ...
 }
 ...
}

使用React Hooks的寫(xiě)法

關(guān)于React hooks的相關(guān)內(nèi)容,這里就不贅述了??梢灾苯硬榭磖eact官方文檔,寫(xiě)得非常好。

https://reactjs.org/docs/hooks-intro.html

本次需求其實(shí)就兩個(gè)邏輯:1、輸入篩選項(xiàng) 。2、查詢(xún)數(shù)據(jù)

主頁(yè)面一個(gè)hooks,處理篩選項(xiàng)以及數(shù)據(jù)展示。數(shù)據(jù)請(qǐng)求邏輯單獨(dú)弄一個(gè)hooks。

主頁(yè)面hooks:

import React, { useState, useEffect} from 'react';
import { Tabs, Input, RangeTime, Button, Table } from './components';

const App = () => {
 // 數(shù)據(jù)類(lèi)型
 const tabs = [{ key: 1, value: '類(lèi)型1' }, { key: 0, value: '類(lèi)型2' }];
 const [tab, setTab] = useState(1);
 // 數(shù)據(jù)ID
 const [dataId, setDataid] = useState('');
 // 標(biāo)題
 const [title, setTitle] = useState('');
 // 時(shí)間區(qū)間, 默認(rèn)為至今一周時(shí)間
 const now = Date.now();
 const [timeRange, setTimeRange] = useState([now - 1000 * 60 * 60 * 24 * 7, now]);
 // 數(shù)據(jù)列表
 const [dataList, setDataList] = useState([]);

 // 點(diǎn)擊搜索按鈕
 function handleBtnClick() {
 // 請(qǐng)求數(shù)據(jù)
 ...
 }

 return <section className="app">
 <Title title="數(shù)據(jù)查詢(xún)" />
 <Tabs label="類(lèi)型" tabs={tabs} tab={tab} onChange={setTab} />
 <Input value={dataId} placeholder="請(qǐng)輸入數(shù)據(jù)ID" onChange={setDataid}>ID</Input>
 <Input value={title} placeholder="請(qǐng)輸入數(shù)據(jù)標(biāo)題" onChange={setTitle}>標(biāo)題</Input>
 <TimeRange label="數(shù)據(jù)時(shí)間" value={timeRange} onChange={handleTimeChange}/>
 <article className="btn-container">
 <Button type="primary" onClick={handleBtnClick}>
 查詢(xún) 
 </Button>
 </article>
 <Table dataList={dataList}></Table>
 </section>
};

上面的代碼,完成了篩選項(xiàng)的處理邏輯。下面來(lái)實(shí)現(xiàn)負(fù)責(zé)數(shù)據(jù)請(qǐng)求的hooks.

數(shù)據(jù)請(qǐng)求hooks:

import React, { useState, useEffect } from 'react';
import jsonp from '../tools/jsonp';


function MyFecth(url) {
 // 是否正在請(qǐng)求中
 const [isLoading, setIsLoanding] = useState(false);
 // 請(qǐng)求參數(shù)
 const [queryParams, setQueryParams] = useState(null);
 // 請(qǐng)求結(jié)果
 const [data, setData] = useState(null);

 // 向接口發(fā)起請(qǐng)求
 const fetchData = async () => {
 if(queryParams === null) {
 return;
 }
 setIsLoanding(true);
 const res = await jsonp({
 url: url,
 data: queryParams
 });
 setData(res);
 setIsLoanding(false);
 }

 // 只要queryParams改變,就發(fā)起請(qǐng)求
 useEffect(()=> {
 fetchData();
 }, [queryParams]);


 // 供外部調(diào)用
 const doGet = (params) => {
 setQueryParams(params);
 }

 return {
 isLoading,
 data,
 doGet
 }
}

export default MyFecth;

在主頁(yè)面中,引用數(shù)據(jù)請(qǐng)求hooks:

import React, { useState, useEffect} from 'react';
import { Tabs, Input, RangeTime, Button, Table } from './components';
import MyFecth from './MyFetch';

const App = () => {

 // ①使用數(shù)據(jù)請(qǐng)求hooks
 const { isLoading, data, doGet } = MyFecth('http://xxx');
 
 // 數(shù)據(jù)類(lèi)型
 const tabs = [{ key: 1, value: '類(lèi)型1' }, { key: 0, value: '類(lèi)型2' }];
 const [tab, setTab] = useState(1);
 // 數(shù)據(jù)ID
 const [dataId, setDataid] = useState('');
 // 標(biāo)題
 const [title, setTitle] = useState('');
 // 時(shí)間區(qū)間, 默認(rèn)為至今一周時(shí)間
 const now = Date.now();
 const [timeRange, setTimeRange] = useState([now - 1000 * 60 * 60 * 24 * 7, now]);
 // 數(shù)據(jù)列表
 const [dataList, setDataList] = useState([]);
 
 
 
 // 點(diǎn)擊搜索按鈕
 function handleBtnClick() {
 // ②點(diǎn)擊按鈕后請(qǐng)求數(shù)據(jù)
 const params = {};
 title && (params.title = title);
 dataId && (params.dataId = dataId);
 params.startTime = String(timeRange[0]);
 params.endTime = String(timeRange[1]);
 doGet(params);
 }
 
 // ③data改變后,重新渲染列表。
 // 這里相當(dāng)于 componentDidUpdate。當(dāng)data發(fā)生改變時(shí),重新渲染頁(yè)面
 useEffect(() => {
 setDataList(data);
 }, [data]);
 
 // ④首次進(jìn)入頁(yè)面時(shí),無(wú)任何篩選項(xiàng)。拉取數(shù)據(jù),渲染頁(yè)面。
 // useEffect第二個(gè)參數(shù)為一個(gè)空數(shù)組,相當(dāng)于在 componentDidMount 時(shí)執(zhí)行該「副作用」
 useEffect(() => {
 doGet({});
 }, []);


 return <section className="app">
 <Title title="數(shù)據(jù)查詢(xún)" />
 <Tabs label="類(lèi)型" tabs={tabs} tab={tab} onChange={setTab} />
 <Input value={dataId} placeholder="請(qǐng)輸入數(shù)據(jù)ID" onChange={setDataid}>ID</Input>
 <Input value={title} placeholder="請(qǐng)輸入數(shù)據(jù)標(biāo)題" onChange={setTitle}>標(biāo)題</Input>
 <TimeRange label="數(shù)據(jù)時(shí)間" value={timeRange} onChange={handleTimeChange}/>
 <article className="btn-container">
 <Button type="primary" isLoading={isLoading} onClick={handleBtnClick}>
 查詢(xún) 
 </Button>
 </article>
 <Table dataList={dataList}></Table>
 </section>
};

關(guān)于React Hooks的一些思考

使用hooks寫(xiě)完這個(gè)需求,最直觀(guān)的感受就是,代碼寫(xiě)起來(lái)很爽。不需要像以前那樣寫(xiě)很多的setState。其次就是

hooks的api設(shè)計(jì)得很優(yōu)秀,一個(gè)useState的就能將【狀態(tài)】和【變更狀態(tài)的邏輯】?jī)蓛膳鋵?duì)。React的基本思想就是【數(shù)據(jù)到視圖的映射】,在hooks中,使用useEffect來(lái)表明其中的【副作用】,感覺(jué)react官方也傾向于不區(qū)分componentDidMount和componentDidUpdate。

從api設(shè)計(jì)就能看出,hooks提倡組件狀態(tài)細(xì)粒度地拆分。在一個(gè)hooks組件中,可能包含很多的狀態(tài),如果用戶(hù)的某些操作,需要同時(shí)修改兩個(gè)狀態(tài),那么我需要分別調(diào)用這兩個(gè)狀態(tài)的修改邏輯,這樣會(huì)導(dǎo)致組件被重新render兩次。而在使用class寫(xiě)法的組件中,只需要一次setState就好。這樣看來(lái),hooks中render兩次的操作,可能會(huì)帶來(lái)些許的性能問(wèn)題 ? 這就要求我們?cè)谠O(shè)計(jì)組件結(jié)構(gòu)和state時(shí),多斟酌,多抽象。

關(guān)于hooks的一些FAQ,官方也有很棒的文檔:https://reactjs.org/docs/hooks-faq.html

寫(xiě)在后面

本文通過(guò)工作中的一個(gè)小需求,完成了一次react hooks的實(shí)踐,不過(guò)上述代碼依然有很多需要優(yōu)化的地方。這次實(shí)踐讓我最直觀(guān)的接觸了react hooks,也幫助自己進(jìn)一步理解了react團(tuán)隊(duì)的一些思想。符合預(yù)期。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

記錄一次完整的react hooks實(shí)踐

記錄一次完整的react hooks實(shí)踐:寫(xiě)在前面 React在16.8版本正式發(fā)布了Hooks。關(guān)注了很久,最近正好有一個(gè)小需求,趕緊來(lái)試一下。 需求描述 需求很簡(jiǎn)單,部門(mén)內(nèi)部的一個(gè)數(shù)據(jù)查詢(xún)小工具。大致長(zhǎng)成下面這樣: 用戶(hù)首次訪(fǎng)問(wèn)頁(yè)面,會(huì)拉取數(shù)據(jù)展示。輸入篩選條件,點(diǎn)擊查詢(xún)后,會(huì)再次拉取數(shù)據(jù)在前
推薦度:
標(biāo)簽: 一個(gè) 記錄 實(shí)踐
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top