React懒加载/动态加载(Suspense +lazy())简单实例

news/2024/11/24 9:07:31/

页面嵌套

    • 两种页面嵌套的方式,一种是父子组件,一种是懒加载
      • 1、父子组件(可略,只用来做例子对比)
      • 2、使用懒加载

两种页面嵌套的方式,一种是父子组件,一种是懒加载

1、原本需要用父子组件来实现页面嵌套,如果嵌套的组件不多,可以直接用visible控制子组件的可见。
2、但是如果无法确定嵌套的是哪个子组件,且子组件又很多的时候,可以使用懒加载

1、父子组件(可略,只用来做例子对比)

父页面

import React,{Component} from "react";
import {Button} from "antd"
import LazyLoadsOne from './LazyLoadsOne' //直接导入子组件
import LazyLoadsTwo from './LazyLoadsTwo'
class LazyLoads extends Component{constructor(props){super(props);this.state = {visible:true,}}genghuanZujian=(vis)=>{this.setState({visible:!vis})}render() {const {visible} =this.state;return(<div><h2>这是父组件</h2><Button type="primary" onClick={()=>{this.genghuanZujian(visible)}} >普通更换组件</Button>{visible&&<LazyLoadsOne/>}{!visible&&<LazyLoadsTwo/>}</div>)}}
export default LazyLoads;

子页面

import React from "react";
const LazyLoadsOne = ()=>{return(<div><h2>这是子页面One</h2></div>);};
export default LazyLoadsOne;
import React from "react";
const LazyLoadsTwo = ()=>{return(<div><h2>这是子页面Two</h2></div>);};
export default LazyLoadsTwo;

在这里插入图片描述

2、使用懒加载

1、新建一个文件PageUtil.js,用于存放子组件地址

export function getPage(pageCode) {switch (pageCode) {case 'LazyLoadsOne':return React.lazy(()=>import('./LazyLoadsOne'));case 'LazyLoadsTwo':return React.lazy(()=>import('./LazyLoadsTwo'));case 'LazyOne':return React.lazy(()=>import('./LazyOne'));case 'LazyTwo':return React.lazy(()=>import('./LazyTwo'));default:return null;}
}

父页面

import React,{Component,Suspense} from "react";
import {Button,Spin,Form,Input} from "antd"
import {getPage} from './PageUtil'
class OneForm extends Component{constructor(props){super(props);this.state = {}}lazyGenghuanZujian=(e)=>{e.preventDefault();this.props.form.validateFields((err, values) => {if (!err) {let arrs = [11,22,33];const pageData = arrs;//当使用一个在浏览器中不存在的标签或以小写开头的组件名时,会报"The tag is unrecognized in this browser"React警告。//组件名首字母大写是React用来区分我们编写的组件和存在于浏览器中的内置标签的惯例const Zujian = getPage(values.note);//获取到工具类的子组件地址this.setState({pageContent :<Zujian data={pageData} onRef={e=>this.Zujian = e}/>})}});}//父调用子的方法fuDiaoZi = () =>{//使用回调函数作为参数,可以可以直接拿到子组件的结果,然后在父组件的回调里做一些处理this.Zujian.fuDiaoZi((res)=>{this.Zujian.setState({test:'我没变'})})}render() {const {pageContent} = this.state;const { getFieldDecorator } = this.props.form;return(<div><h2>这是父组件</h2><Form onSubmit={this.lazyGenghuanZujian}><Form.Item label="请输入要加载的模块">{getFieldDecorator('note', {rules: [{ required: true, message: 'Please input your note!' }],})(<Input />)}</Form.Item><Form.Item wrapperCol={{ span: 12, offset: 5 }}><Button type="primary" htmlType="submit">确定</Button></Form.Item><Form.Item wrapperCol={{ span: 12, offset: 5 }}><Button type="primary" onClick={this.fuDiaoZi}>调用子组件的方法</Button></Form.Item></Form><Suspense fallback={<Spin/>} >{pageContent}</Suspense></div>)}}const LazyLoads = Form.create()(OneForm)
export default LazyLoads;

子组件1

import React from "react"
import {Form} from "antd";
class LazyOne extends React.Component{constructor(props){super(props);this.state = {test:'我我我',};}componentDidMount() {//使用onRef绑定this.props.onRef && this.props.onRef(this)}fuDiaoZi=(func)=>{this.setState({test:'我变了'});setTimeout(func,1000)}render() {const {test} = this.state;return(<div><h2>LazyOne111111</h2><p>{test}</p></div>)}
}
const LazyOnes = Form.create()(LazyOne)
export default LazyOnes;

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/883714.html

相关文章

【专题速递】在线K歌、云化XR、咔嚓剪辑和FFmpeg直播能力更新计划

// 在线K歌的技术方案选型有哪些&#xff1f;对于沉浸式XR我们又有什么新的思考&#xff1f;高性能低依赖的剪辑视频需要具备什么技术&#xff1f;7月29日LiveVideoStackCon2023上海站客户端体验与性能优化专场&#xff0c;为您解答。 客户端体验与性能优化 客户端作为直接面…

python编程课后练习(一)

变量的命名和使用 1、简单打印&#xff1a;将一条消息存储到变量中&#xff0c;并将其打印出来 news “Hello, python, nice to meet you!” print(news) 2、多条简单消息&#xff1a;将一条消息存储在变量中&#xff0c;并将其打印出来&#xff1b;再将变量的值修改为一条新…

java 电子邮件 received:头文件,奇怪的事情发生在gmail头文件和外部帐户中

在我的网站上有一个表格可以订阅我的通讯。该表单通过POST方法将用户的电子邮件发送到URL(nicetomeetyou.php)。在这个URL中&#xff0c;我有以下代码&#xff1a; $email $_POST[email]; $subject "¡Welcome to My World!"; // Set content-type header for …

驼峰命名day(44)

题目描述&#xff1a; 从C/C转到Java的程序员&#xff0c;一开始最不习惯的就是变量命名方式的改变。C语言风格使用下划线分隔多个单词&#xff0c;例如“hello_world”&#xff1b;而Java则采用一种叫骆驼命名法的规则&#xff1a;除首个单词以外&#xff0c;所有单词的首字母…

解读第一个C++程序

与学习C语言一样&#xff0c;开头一定先给大家介绍一下C&#xff0c;看看第一个简单的C程序到底长什么样子&#xff0c;初步了解C&#xff0c;请看如下代码&#xff1a; 1 2 3 4 5 6 7 #include<iostream> using namespace std; int main() { cout<<"Nic…

【每日一题】骆驼命名法

【每日一题】骆驼命名法 文章目录 【每日一题】骆驼命名法1、题目来源2、题目描述3、输入/出描述4、示例5、解题思路6、代码展示 1、题目来源 牛客网&#xff1a;骆驼命名法 2、题目描述 从C/C转到Java的程序员&#xff0c;一开始最不习惯的就是变量命名方式的改变。C语言风格使…

出卖具有知识产权的计算机,出卖具有知识产权的计算机软件等标的物,该标的物的知识产权属于买受人。()A.正确B.错误...

参考答案如下 出卖产权错误——What nationality are you?——Im _______. 知识正确Whats the weather ____________? 计等标的物的物的知Whats \灾区\in English? 算机识产受人Whats \灾区\in English? 软件Our train is _______ at Shanghai at seven oclock this evenin…

python编辑程序用print函数输出中国加油武汉加油_python练习1之print函数

Python3 print 代码练习 1 print("Hello world!") print("Welcome!") print("Nice to meet you ! ") print("Lets go!") print("1+1=2") print("1+2=3") print("1+3=4") print("……") prin…