上一篇文章介绍了关于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根据传参的不同动态注册不同的子组件的更多相关文章

  1. Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?

    原文:https://blog.csdn.net/zhouweixue_vivi/article/details/78550738 2017年11月16日 14:22:50 zhouweixue_vi ...

  2. vue父组件异步获取动态数据传递给子组件获取不到值

    原理: 在父组件中使用axios获取异步数据传给子组件,但是发现子组件在渲染的时候并没有数据,在created里面打印也是空的,结果发现一开始子组件绑定的数据是空的,在请求数据没有返回数据时,子组件就 ...

  3. 微信小程序 子组件给父组件传参

    子组件给父组件传参只需这4步: 子组件的两步: 1.子组件绑定函数 addInfo <button type="primary" bindtap="addInfo& ...

  4. React Hooks中父组件中调用子组件方法

    React Hooks中父组件中调用子组件方法 使用到的hooks-- useImperativeHandle,useRef /* child子组件 */ // https://reactjs.org ...

  5. python 根据传进来的参数,动态拼接sql

    根据传进来的参数,动态拼接sql,可用于实现一个方法,有些字段不确定,又用到的情况,如查询,三个查询条件,有的时候只用到一个查询条件,其他用不到则不需要拼接 def show_runjob_detai ...

  6. Mvc动态注册HttpModule详解

    序言 注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件.目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件.第一种是通过Gl ...

  7. Android Studio NDK JNI动态注册本地方法

    概述 可能大家觉得javah生成的函数名又臭又长,不太好看.这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来. 实现 这里通过JNIEnv的Resisterna ...

  8. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  9. Android 动态注册 亮屏、息屏广播

    /***************************************************************************** * Android 动态注册 亮屏.息屏广 ...

随机推荐

  1. hdu 2986 Ballot evaluation (Simulation)

    Problem - 2986 之前在华工赛见过的一道简单的模拟,用map轻松干掉.为了精确,要全程用整型比较.轻松1y~ 代码如下: #include <cstdio> #include ...

  2. H3C 配置RIP peer

  3. [转载] 学会使用Web Service上(服务器端访问)~~~

    http://www.360doc.com/content/10/0712/12/541242_38461863.shtml# 关于什么是Web Service,相信在很多地方都会有介绍.简单的讲,W ...

  4. webpack学习(五)entry和output的基础配置

    1:entry和output就是打包的入口和出口的两个对象.但是如果入口文件就一个的话(应该说只希望打包出一个脚本文件), entry直接跟一个字符串(入口文件路径)就可以了.如:entry : &q ...

  5. Python--day37--守护进程和几个常用的方法

    1,p.daemon = True #设置子进程为守护进程 #守护进程会随着主进程的代码执行完毕 而结束 #子进程 --> 守护进程 import time from multiprocessi ...

  6. P1055 连通块问题

    题目描述 给出一个n行m列的地图,'.'代表陆地,'W'代表水.现在需要你计算地图中有多少个水块.八个方向可以连通 比如:4*6的地图 ...WWW ...WW. WW.... .....W 中有3个 ...

  7. H3C VLAN显示及维护

  8. schema list validator --python cerberus

    工作中需要对如下json结构进行验证: "ActiveStatus" : [ { "effectiveDates" : { "effectiveFro ...

  9. The first day of Crawler learning

    使用BeautifulSoup解析网页 Soup = BeautifulSoup(urlopen(html),'lxml') Soup为汤,html为食材,lxml为菜谱 from bs4 impor ...

  10. 20191024-3 互评Alpha阶段作品——构建之法组

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860 基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评 ...