Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >React / JSX动态组件名称

React / JSX动态组件名称
EN

Stack Overflow用户
提问于 2015-04-26 09:24:00
回答 14查看 184.7K关注 0票数 237

我正在尝试根据组件的类型动态呈现组件。

例如:

代码语言:javascript
运行
AI代码解释
复制
var type = "Example";
var ComponentName = type + "Component";
return <ComponentName />; 
// Returns <examplecomponent />  instead of <ExampleComponent />

我尝试了这里提出的解决方案React/JSX dynamic component names

这在编译时给了我一个错误(使用browserify进行gulp)。在我使用数组语法的地方,它需要XML。

我可以通过为每个组件创建一个方法来解决这个问题:

代码语言:javascript
运行
AI代码解释
复制
newExampleComponent() {
    return <ExampleComponent />;
}

newComponent(type) {
    return this["new" + type + "Component"]();
}

但这意味着我创建的每个组件都有一个新的方法。对于这个问题,一定有更好的解决方案。

我非常乐于接受建议。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2015-04-26 10:07:11

<MyComponent />编译为React.createElement(MyComponent, {}),它需要一个字符串(HTML )或一个函数(ReactClass)作为第一个参数。

您可以将组件类存储在一个名称以大写字母开头的变量中。参见HTML tags vs React Components

代码语言:javascript
运行
AI代码解释
复制
var MyComponent = Components[type + "Component"];
return <MyComponent />;

编译为

代码语言:javascript
运行
AI代码解释
复制
var MyComponent = Components[type + "Component"];
return React.createElement(MyComponent, {});
票数 228
EN

Stack Overflow用户

发布于 2016-11-30 19:01:42

这里有一个关于如何处理这种情况的官方文档:https://facebook.github.io/react/docs/jsx-in-depth.html#choosing-the-type-at-runtime

基本上它是这样说的:

错误:

代码语言:javascript
运行
AI代码解释
复制
import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
    photo: PhotoStory,
    video: VideoStory
};

function Story(props) {
    // Wrong! JSX type can't be an expression.
    return <components[props.storyType] story={props.story} />;
}

正确:

代码语言:javascript
运行
AI代码解释
复制
import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
    photo: PhotoStory,
    video: VideoStory
};

function Story(props) {
    // Correct! JSX type can be a capitalized variable.
    const SpecificStory = components[props.storyType];
    return <SpecificStory story={props.story} />;
}
票数 195
EN

Stack Overflow用户

发布于 2019-04-21 07:08:50

应该有一个容器将组件名称映射到所有应该动态使用的组件。组件类应该在容器中注册,因为在模块化环境中,没有其他地方可以访问它们。如果不显式指定组件类,就不能通过它们的名称来标识组件类,因为在生产中,函数name是最小化的。

组件映射

它可以是普通对象:

代码语言:javascript
运行
AI代码解释
复制
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;

Map实例:

代码语言:javascript
运行
AI代码解释
复制
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);

普通对象更适合,因为它得益于属性速记。

Barrel模块

具有命名导出的barrel module可以充当这样的映射:

代码语言:javascript
运行
AI代码解释
复制
// Foo.js
export class Foo extends React.Component { ... }

// dynamic-components.js
export * from './Foo';
export * from './Bar';

// some module that uses dynamic component
import * as componentsMap from './dynamic-components';

const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;

这在每个模块的代码样式中只有一个类的情况下工作良好。

装饰者

装饰器可以与类组件一起用于语法糖,这仍然需要显式地指定类名并在映射中注册它们:

代码语言:javascript
运行
AI代码解释
复制
const componentsMap = {};

function dynamic(Component) {
  if (!Component.displayName)
    throw new Error('no name');

  componentsMap[Component.displayName] = Component;

  return Component;
}

...

@dynamic
class Foo extends React.Component {
  static displayName = 'Foo'
  ...
}

装饰器可以用作具有功能组件的高阶组件:

代码语言:javascript
运行
AI代码解释
复制
const Bar = props => ...;
Bar.displayName = 'Bar';

export default dynamic(Bar);

使用non-standard displayName而不是随机属性也有利于调试。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29875869

复制
相关文章
React JSX语法与组件
上面这段有趣的例子既不是标准的JavaScript也不是HTML,它就是我们接下来要介绍的JSX的语法,是一种JavaScript的扩展。在React中使用JSX描述一个UI是什么样子的,就好像HTML告诉浏览器我们看到的页面是什么样子。最开始接触JSX时会感觉它很像一种模板语言,但是除了提供模板能力之外,他拥有JavaScript所有的能力。
随风溜达的向日葵
2018/07/30
1K0
React学习(1)——JSX语法与React组件
    上面这段有趣的例子既不是标准的JavaScript也不是HTML,它就是我们接下来要介绍的JSX的语法,是一种JavaScript的扩展。在React中使用JSX描述一个UI是什么样子的,就好像HTML告诉浏览器我们看到的页面是什么样子。最开始接触JSX时会感觉它很像一种模板语言,但是除了提供模板能力之外,他拥有JavaScript所有的能力。
随风溜达的向日葵
2018/08/15
7410
React报错之组件不能作为JSX组件使用
原文链接:https://bobbyhadz.com/blog/react-cannot-be-used-as-a-jsx-component[1]
chuckQu
2022/08/19
2.5K0
React JSX
它被称为 JSX, 一种 JavaScript 的语法扩展。 我们推荐在 React 中使用 JSX 来描述用户界面。
陈不成i
2021/07/29
6210
React - jsx
1 1. 什么是JSX语法 2 2. jsx语法示例与渲染的VNode节点 3 3. jsx的渲染流程 4 4. jsx中的js和html的写法不同 5 a. js:{ js语法 } 6 i. 花括号里边一定要返回字符串才能渲染 7 ii. {{ 双花括号表示js语法里的对象格式 }} 8 iii. 花括号里可以写表达式、三元、有返回值且返回字符串的函数调用 9 iv. 花括号里直接放对象报错 10 v. 数组可以直接被渲染到页面中。 11 b. html:<html语法> 12 i. class等关键字不能用做html的属性(如class、for等不行,需要替换成别的) 13 1) class -> className 14 2) for -> htmlFor 15 c. a标签写了以后,必须写href属性 16 d. 组件根节点只能是一个标签,不能有并列标签。否则报错! 17 三种方法实现空白标签包裹:(就像小程序的block标签、又像vue的template标签) 18 i. <React.Fragment>空白标签1</React.Fragment> 19 ii. import { Fragment } from 'react';<Fragment>空白标签1</Fragment> 20 iii. <>空白标签2</> 21 e. 列表渲染 - 迭代的方法(没有for):利用数组进行渲染 22 f. key值唯一的绑定 23 g. 条件切换的使用(没有if else、简直反人类) 24 h. 动态样式的绑定 - style的值需要是一个js语法,包裹在对象里边。 25 i. v-html类似用法:dangerouslySetInnerHTML={ {__html: variableName} }【innerHTML容易造成xss攻击,避免使用】 26 j. jsx中的注释 27 i. 多行注释:{ /** js注释 **/ } 28 ii. 单行注释: 29 { 30 // 单行注释,花括号如果提上来就被注释了。所以换行 31 }
xing.org1^
2019/11/26
2.1K0
React - jsx
【React】初识React&JSX
React 是一个用于构建用户界面(UI,对咱们前端来说,简单理解为:HTML 页面)的 JavaScript 库
且陶陶
2023/04/12
2.2K0
【React】初识React&JSX
React 进阶 - JSX
最后,在调和阶段,上述 React element 对象的每一个子节点都会形成一个对应的 fiber 对象,然后通过 sibling、return、child 将每一个 fiber 对象联系起来。
Cellinlab
2023/05/17
8030
React 进阶 - JSX
React学习笔记(二)—— JSX、组件与生命周期
JSX = JavaScript XML,这是React官方发明的一种JS语法(糖)
张果
2023/03/01
5.9K0
React学习笔记(二)—— JSX、组件与生命周期
【React基础-2】JSX
本文是【React基础】系列的第二篇文章,这篇文章中我们介绍一下在react中一种另类的编码方式——JSX。它可是允许我们将HTML标签直接编写在JS代码中的呦,感兴趣的话就一起来学习吧。
X北辰北
2022/02/21
6710
【React基础-2】JSX
React之JSX语法
如果要使用JSX,需要得到语法的支持,你可以使用Babel来进行转换。在该篇文章当中直接引入Babel文件。 将上一篇文章的“你好,世界”拿过来看一下:
用户1272076
2019/03/27
8390
React学习笔记—JSX
所谓JSX,是JavaScript的语法扩展(eXtension),让我们在JavaScript中可以编写像HTML一样的代码。 JSX中的这几段代码看起来和HTML几乎一摸一样,都可以使用<div><button>之类的元素,所以只要熟悉HTML,学习JSX完全不成问题,但是,我们一定要明白两者的不同之处。 首先,在JSX中使用的“元素”不局限于HTML中的元素,可以是任何一个React组件。例如: // Counter组件 import React, { Component } from 'react'
小胖
2018/06/28
8780
React---JSX使用
    1) 遇到 <开头的代码, 以标签的语法解析: html同名标签转换为html同名元素, 其它标签需要特别解析
半指温柔乐
2021/04/15
5860
React--2: jsx
parse:用于 json 转为 js 的对象 stringfy:用于将 js 对象转为 json
用户4793865
2023/01/12
5620
React动态添加标签组件
在前端开发的过程中,一些表单的输入经常需要输入多个内容,如果采用一个输入框+逗号分隔的方式,展示起来不是很清晰,一般需要采用标签的方式
zx钟
2023/09/12
5380
React动态添加标签组件
React学习笔记之JSX
什么是JSX? JSX 是一个看起来很像 XML 的 JavaScript语法扩展。React 可以用来做简单的 JSX 句法转换。 下面看一段React组件的代码: // 未使用JSX Reac
IMWeb前端团队
2017/12/29
1K0
React学习笔记之JSX
JSX 是一个看起来很像 XML 的 JavaScript语法扩展。React 可以用来做简单的 JSX 句法转换。 下面看一段React组件的代码:
IMWeb前端团队
2019/12/04
6140
React中JSX的理解
JSX是快速生成react元素的一种语法,实际是React.createElement(component, props, ...children)的语法糖,同时JSX也是Js的语法扩展,包含所有Js功能。
WindRunnerMax
2020/12/22
2.6K0
react之jsx编译原理
使用react的朋友想必对jsx的语法相当熟悉,简单点来说,就是JavaScript和html可以混着写,灵活快速,而且可以一目了然的看清楚DOM的结构,当然jsx需要经过babel编译为javascript对象,再经过渲染插入到页面上。 接下来我们来探讨几个问题: react内部是如何处理JavaScript和html混写的代码? 组件名为啥首字母一定要大写? 在花括号{}里边内容,比如是一行表达式 var a = 'hello world'; 为啥会报错? 下边来具体看看jsx处理逻辑,上例子: 1、
QQ音乐前端团队
2019/07/02
3.1K0
react之jsx编译原理
React基础之JSX语法
概述 JSX是React的核心组成部分,它使用XML标记的方式去直接声明界面,界面组件之间可以互相嵌套。可以理解为在JS中编写与XML类似的语言,一种定义带属性树结构(DOM结构)的语法,它的目的不是要在浏览器或者引擎中实现,它的目的是通过各种编译器将这些标记编译成标准的JS语言。 使用JSX语法后,你必须要引入babel的JSX解析器,把JSX转化成JS语法,这个工作会由babel自动完成。同时引入babel后,你就可以使用新的es6语法,babel会帮你把es6语法转化成es5语法,兼容更多的浏览器。
xiangzhihong
2018/02/06
2.2K0
React语法基础之JSX
概述 React的核心机制之一就是可以在内存中创建虚拟的DOM元素。React利用虚拟DOM来减少对实际DOM的操作从而提升性能。 JSX是什么 JSX是React的核心组成部分,它使用XML标记的方式去直接声明界面,界面组件之间可以互相嵌套。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析。使用虚拟DOM可以将React的语法转换为标准的JS语言。 简单来说,JSX就是Javascript和XML结合的一种格式。 JSX
xiangzhihong
2018/02/06
1.9K0
React语法基础之JSX

相似问题

React/JSX动态组件名称

10

React / JSX组件的动态数量

27

React JSX Onclick组件

20

React:动态导入jsx

34

未创建动态名称react组件

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档