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 动态注册 亮屏.息屏广 ...
随机推荐
- H3C ISDN DCC基本配置示例
- 五分钟搭建一个基于BERT的NER模型
BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...
- 深入理解 Embedding层的本质
继上文https://blog.csdn.net/weixin_42078618/article/details/82999906探讨了embedding层的降维效果,时隔一个月,分享一下嵌入层在NP ...
- HDU 3397"Sequence operation"(线段树区间和并)
传送门 •题意 给你一个仅包含 0 和 1 的序列: 在这个序列上有如下操作: (1)0 a b : 将 [a,b] 区间的数置 0: (2)1 a b : 将 [a,b] 区间的数置 1: (3)2 ...
- P1044 最大值最小化
题目描述 在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要.当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写 \( ...
- EJB版本
1999: ejb version 1.1 -- j2ee 1.22001: ejb version 2.0 -- j2ee 1.32003: ejb version 2.1 -- j2ee 1.42 ...
- C# 如何给 ValueTuple 返回值添加注释
在 C# 7.0 可以在一个方法的返回,返回多个参数,通过 ValueTuple 的方法,但是和单个参数返回不同的是,如何对多个参数返回每个参数进行单独的注释? 如使用下面的代码,我尝试在一个方法返回 ...
- Spark MLlib 示例代码阅读
阅读前提:有一定的机器学习基础, 本文重点面向的是应用,至于机器学习的相关复杂理论和优化理论,还是多多看论文,初学者推荐Ng的公开课 /* * Licensed to the Apache Softw ...
- 修改jupyter notebook响应的浏览器
Windows下更改jupyter notebook默认响应的浏览器为Chrome 1.命令行下输入:jupyter notebook --generate-config 2.C盘中找到并打开文件:C ...
- 35.python之事件驱动模型
转载:https://www.cnblogs.com/yuanchenqi/articles/5722574.html 事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么 ...