React高阶组件优化文件结构流程详解
其实高阶组件是一个将组件写的更灵活的方式,他的应用场景在业务开发中会非常多样
这里 我们演示一种 主要还是解决问题的思想最重要 或者是 这个不叫解决问题 而是设计组件结构的思路
我们来模拟一个场景
在class="lazy" data-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;
其实 两个组件写的写法 基本就是一样的
只是调用的接口 和使用的字段不一样而已 像这么相似的东西 我们真的没必要写两个组件来处理 直接一个高阶组件就行了
我们先将这两个组件删了
然后 我们在components目录下创建 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;
这样 我们的一个高阶组件就写好了 然后 讲解一下
我们 方法 第一个参数 接收一个url参数 这个参数 用来控制fetch网络请求的地址 也可以理解为控制他去调哪个接口
然后 第二个参数 是一个组件
最后 将请求回来的数据 给了组件的data参数
然后 在components下创建 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作为了 参数 然后 第二个参数 现写的 代码结构 通过接到的 data参数来处理组件内部 然后再传给高阶组件 去渲染
这个写法就会使我们的多组件项目简化很多
最后 修改 class="lazy" data-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>
)
}
}
运行结果如下
大家可以照着写一次 体会一下这种关联渲染的逻辑 用好了 可以让你的项目组件布局简便非常多 组件越多发挥空间越大
到此这篇关于React高阶组件优化文件结构流程详解的文章就介绍到这了,更多相关React优化文件结构内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341