react根据传参的不同动态注册不同的子组件
上一篇文章介绍了关于Vue如何根据传参的不同动态注册不同的子组件,实现过程请查阅Vue.extend动态注册子组件,由Vue的这个功能我就自然联想到了使用react该如何实现同样的功能呢。其实,用react实现同样的功能会更简单,不用那么多的API,不用去查找这些平时可能用的很少的API的用法,这也是为什么很多人喜欢react的原因,react只提供了一些核心的API,至于怎么实现特定的功能,你自己想办法去实现咯,这就是足够灵活啊!!!
需要导入不同的组件还是用到了import和它的then回调方法,代码如下:
import React, { Component } from 'react'
class RegComponent extends Component {
constructor(props){
super(props)
this.state = {
component: null,
}
regComponentHandle(componentName){
import(`@/pages/${componentName}`).then(res => {
let { default: component } = res;
this.setState({
component,
});
})
}
render(){
let C = this.state.component;
let data = {
mgs: "动态组件传参"
}
const props = {...this.props, data};
return (
<div>
<p><button type="button " onClick={this.regComponentHandle.bind(this, 'customHooks')}>动态注册组件</button></p>
{C ? <C {...props } /> : null}
</div>
)
}
}
export default RegComponent
以上是react有状态组件的实现方法,那么无状态组件也就是函数式组件的实现方法呢?
函数式组件的实现方法要借助react hooks的useState方法来实现:
const RegComponent = () => {
const [component, setComonent] = useState({ Com: null })
const regComponentHandle = (componentName) => {
import(`@/pages/${componentName}`).then(res => {
let { default: component } = res;
setComonent({ Com: component });
})
}
const { Com } = component
return (
<div>
<p><Button type="primary" onClick={() => regComponentHandle('useContext')}>动态注册组件</Button></p>
{Com ? <Com {...props} /> : null}
</div>
);
}
export default RegComponent
注意,这里需要特别说明一下:
1、useState方法可以接收一个函数作为参数,但是该函数中的代码只会在初始化时执行一次;
2,、由于useState方法可以接收一个函数作为参数,于是我就想当然的认为可以把一个函数组件作为参数传给useState,也想当然的认为const [component, setComonent] = useState()中的component是可以拿到传过来的函数组件的,结果很出人意料,component可以获取到传过来的参数,但此时的component的值已经不是一个函数组件了,而是一个$$typeof: Symbol(react.element), type: ƒ, key: null, ref: null,当然了,打印出来的component的值不止这些,还有一长串,这里我就不全部贴出来了。很显然,这不是一个组件,好像是一个独一无二(Symbol)的react.element,也就不能显示到页面中了,所以我就绕了一个弯,把拿到的函数组件赋值给一个对象的属性,然后再通过该属性获取到这个函数组件就完美解决了这个问题。
3、说一下为什么用到了react hooks的useState方法,因为函数式组件没有生命周期,没有setState,所以要想在函数式组件中更新数据并实时显示更新后的数据,我能想到的就只有react hooks的useState方法以及dva模式(dva模式就那几个API,用起来很简单,没什么说的)了。
react根据传参的不同动态注册不同的子组件的更多相关文章
- Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?
原文:https://blog.csdn.net/zhouweixue_vivi/article/details/78550738 2017年11月16日 14:22:50 zhouweixue_vi ...
- vue父组件异步获取动态数据传递给子组件获取不到值
原理: 在父组件中使用axios获取异步数据传给子组件,但是发现子组件在渲染的时候并没有数据,在created里面打印也是空的,结果发现一开始子组件绑定的数据是空的,在请求数据没有返回数据时,子组件就 ...
- 微信小程序 子组件给父组件传参
子组件给父组件传参只需这4步: 子组件的两步: 1.子组件绑定函数 addInfo <button type="primary" bindtap="addInfo& ...
- React Hooks中父组件中调用子组件方法
React Hooks中父组件中调用子组件方法 使用到的hooks-- useImperativeHandle,useRef /* child子组件 */ // https://reactjs.org ...
- python 根据传进来的参数,动态拼接sql
根据传进来的参数,动态拼接sql,可用于实现一个方法,有些字段不确定,又用到的情况,如查询,三个查询条件,有的时候只用到一个查询条件,其他用不到则不需要拼接 def show_runjob_detai ...
- Mvc动态注册HttpModule详解
序言 注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件.目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件.第一种是通过Gl ...
- Android Studio NDK JNI动态注册本地方法
概述 可能大家觉得javah生成的函数名又臭又长,不太好看.这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来. 实现 这里通过JNIEnv的Resisterna ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- Android 动态注册 亮屏、息屏广播
/***************************************************************************** * Android 动态注册 亮屏.息屏广 ...
随机推荐
- hdu 2986 Ballot evaluation (Simulation)
Problem - 2986 之前在华工赛见过的一道简单的模拟,用map轻松干掉.为了精确,要全程用整型比较.轻松1y~ 代码如下: #include <cstdio> #include ...
- H3C 配置RIP peer
- [转载] 学会使用Web Service上(服务器端访问)~~~
http://www.360doc.com/content/10/0712/12/541242_38461863.shtml# 关于什么是Web Service,相信在很多地方都会有介绍.简单的讲,W ...
- webpack学习(五)entry和output的基础配置
1:entry和output就是打包的入口和出口的两个对象.但是如果入口文件就一个的话(应该说只希望打包出一个脚本文件), entry直接跟一个字符串(入口文件路径)就可以了.如:entry : &q ...
- Python--day37--守护进程和几个常用的方法
1,p.daemon = True #设置子进程为守护进程 #守护进程会随着主进程的代码执行完毕 而结束 #子进程 --> 守护进程 import time from multiprocessi ...
- P1055 连通块问题
题目描述 给出一个n行m列的地图,'.'代表陆地,'W'代表水.现在需要你计算地图中有多少个水块.八个方向可以连通 比如:4*6的地图 ...WWW ...WW. WW.... .....W 中有3个 ...
- H3C VLAN显示及维护
- schema list validator --python cerberus
工作中需要对如下json结构进行验证: "ActiveStatus" : [ { "effectiveDates" : { "effectiveFro ...
- The first day of Crawler learning
使用BeautifulSoup解析网页 Soup = BeautifulSoup(urlopen(html),'lxml') Soup为汤,html为食材,lxml为菜谱 from bs4 impor ...
- 20191024-3 互评Alpha阶段作品——构建之法组
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860 基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评 ...