React高階組件優(yōu)化文件結(jié)構(gòu)流程詳解
其實高階組件是一個將組件寫的更靈活的方式,他的應(yīng)用場景在業(yè)務(wù)開發(fā)中會非常多樣
這里 我們演示一種 主要還是解決問題的思想最重要 或者是 這個不叫解決問題 而是設(shè)計組件結(jié)構(gòu)的思路
我們來模擬一個場景
在src下有一個 components 文件夾目錄
在 components 下有一個 banner.jsx組件 參考代碼如下
import React,{ Component } from 'react';
class Banner extends Component {
constructor() {
super();
this.state = {
loading: true,
banner: null
}
}
componentDidMount() {
fetch("http://iwenwiki.com/api/blueberrypai/getIndexBanner.php").then(res =>
res.json()).then(banner => {
this.setState({
loading: false,
banner: banner
})
})
}
render() {
if(this.state.loading) {
return (
<div>loading</div>
)
} else {
return (
<h1> {this.state.banner.banner[0].title }</h1>
)
}
}
}
export default Banner;
然后 在components下有一個 chengpin.jsx組件 參考代碼如下
import React,{ Component } from 'react';
class Chengpin extends Component {
constructor() {
super();
this.state = {
loading: true,
chengpin: null
}
}
componentDidMount() {
fetch("http://iwenwiki.com/api/blueberrypai/getChengpinInfo.php").then(res =>
res.json()).then(chengpin => {
this.setState({
loading: false,
chengpin: chengpin
})
})
}
render() {
if(this.state.loading) {
return (
<div>loading</div>
)
}else{
return (
<h1> {this.state.chengpin.chengpinInfo[0].title}</h1>
)
}
}
}
export default Chengpin;
其實 兩個組件寫的寫法 基本就是一樣的
只是調(diào)用的接口 和使用的字段不一樣而已 像這么相似的東西 我們真的沒必要寫兩個組件來處理 直接一個高階組件就行了
我們先將這兩個組件刪了
然后 我們在components目錄下創(chuàng)建 withFetch.jsx組件
參考代碼如下
import React from 'react'
const withFetch = (url) => (View) => {
return class extends Component {
constructor() {
super();
this.state = {
loading: true,
data: null
}
}
componentDidMount() {
fetch(url)
.then(res => res.json())
then(data => {
this.setstate({
loading: false,
data: data
});
})
}
render() {
if(this.state.loading) {
return(
<div>loadding....</div>
)
}else{
return <View data={this.state.data }></View>
}
}
}
}
export default withFetch;
這樣 我們的一個高階組件就寫好了 然后 講解一下
我們 方法 第一個參數(shù) 接收一個url參數(shù) 這個參數(shù) 用來控制fetch網(wǎng)絡(luò)請求的地址 也可以理解為控制他去調(diào)哪個接口
然后 第二個參數(shù) 是一個組件
最后 將請求回來的數(shù)據(jù) 給了組件的data參數(shù)
然后 在components下創(chuàng)建 componentTransfer.jsx文件 用于使用高階組件
import React from "react"
import withFetch from "./withFetch"
const Chengpin = withFetch("http://iwenwiki.com/api/blueberrypai/getChengpinInfo.php")(props =>{
return(
<div>
<h1> {props.data.chengpinInfo[0].title}</h1>
</div>
)
})
const Banner = withFetch("http://iwenwiki.com/api/blueberrypai/getIndexBanner.php")(props =>{
return(
<div>
<h1>{ props.data.banner[0].title } </h1>
</div>
)
})
let data = {
Chengpin: Chengpin,
Banner: Banner
}
export default data;
這樣 我們就將 url作為了 參數(shù) 然后 第二個參數(shù) 現(xiàn)寫的 代碼結(jié)構(gòu) 通過接到的 data參數(shù)來處理組件內(nèi)部 然后再傳給高階組件 去渲染
這個寫法就會使我們的多組件項目簡化很多
最后 修改 src目錄下的 App.js 代碼如下
import './App.css';
import React from "react";
import ComponentTransfer from "./components/componentTransfer";
export default class App extends React.Component{
constructor(props){
super(props);
this.state = {
}
}
render(){
return (
<div>
<ComponentTransfer.Chengpin/>
<ComponentTransfer.Banner/>
</div>
)
}
}
運行結(jié)果如下

大家可以照著寫一次 體會一下這種關(guān)聯(lián)渲染的邏輯 用好了 可以讓你的項目組件布局簡便非常多 組件越多發(fā)揮空間越大
到此這篇關(guān)于React高階組件優(yōu)化文件結(jié)構(gòu)流程詳解的文章就介紹到這了,更多相關(guān)React優(yōu)化文件結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Zustand介紹與使用 React狀態(tài)管理工具的解決方案
本文主要介紹了Zustand,一種基于React的狀態(tài)管理庫,Zustand以簡潔易用、靈活性高及最小化原則等特點脫穎而出,旨在提供簡單而強大的狀態(tài)管理功能2024-10-10
使用useMutation和React Query發(fā)布數(shù)據(jù)demo
這篇文章主要為大家介紹了使用useMutation和React Query發(fā)布數(shù)據(jù)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
解決React報錯Property 'X' does not 
這篇文章主要為大家介紹了解決React報錯Property 'X' does not exist on type 'HTMLElement',有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
React中常見的TypeScript定義實戰(zhàn)教程
這篇文章主要介紹了React中常見的TypeScript定義實戰(zhàn),本文介紹了Fiber結(jié)構(gòu),F(xiàn)iber的生成過程,調(diào)和過程,以及 render 和 commit 兩大階段,需要的朋友可以參考下2022-10-10
使用 Rails API 構(gòu)建一個 React 應(yīng)用程序的詳細步驟
這篇文章主要介紹了使用 Rails API 構(gòu)建一個 React 應(yīng)用程序的詳細步驟,主要包括后端:Rails API部分,前端:React部分及React組件的相關(guān)操作,具有內(nèi)容詳情跟隨小編一起看看吧2021-08-08

