当前位置:  开发笔记 > 编程语言 > 正文

动态JSX元素/标记名称

如何解决《动态JSX元素/标记名称》经验,为你挑选了1个好方法。

我只是想知道是否有一种最佳实践方法来动态地使用ReactJS渲染元素

考虑以下情况:

(1)参数工厂组件:
一个参数化工厂组件,其作用是基于字符串参数呈现组件,有没有办法这样做而不必恢复到React.createElement?

// The following doesn't work
class Quiz extends React.Component{
  constructor (props){
    super (props);
    this.state = {
      questionText: '',
      correctAnswer: [],
      assetType: ['DragNDrop','MultipleChoice','MatchPairs']
    }
  }
  render(){
    const { questionText, correctAnswer } = this.state;
    return <{this.state.assetType[this.props.typeIndex] />;
  }
}

(2)动态HTML标记:
基于整数输入渲染不同的HTML标记标记.为此,我最初尝试使用模板字符串,但不得不求助于条件渲染.

// No joy with Template strings
render (){
  <{`h${this.state.headerSize}`}>
    {this.state.headerText}
  
}

我喜欢使用JSX,能够使用动态元素名称来保持一致性会很不错.

我也知道:

assetType: ['DragNDrop','MultipleChoice','MatchPairs']

可以存储为:

assetType: [,, ]

哪个会奏效.

我对JSX元素数组的一个问题是如何将这些JSX元素存储在数据库中?我猜我必须存储它们,Strings但是当从数据库中拉回来时如何使用它们?

有人可以建议任何有关这些问题的工作和最佳实践方法吗?



1> Pineda..:

关于动态HTML标记:

编辑:
正如文档建议的那样,如果首先首先分配大写变量,可以在运行时使用动态类型:

class Quiz extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            questionText: '',
            correctAnswer: [],
            assetType: ['DragNDrop', 'MultipleChoice', 'MatchPairs']
        }
    }
    render() {
        const ElementNameStartsWithCapitalLetter = this.state.assetType[0];
           // ^ -- capital letter here, ensure this works when used in JSX
        return ;
    }
}

这是因为用户定义的JSX组件必须大写.



以前的解决方案:

使用React.createElement:

class Quiz extends React.Component{
  constructor (props){
    super (props);
    this.state = {
      questionText: '',
      correctAnswer: [],
      assetType: ['DragNDrop','MultipleChoice','MatchPairs']
    }
  }
  render(){
    const { questionText, correctAnswer } = this.state;
    {React.createElement(
      [this.props.typeIndex],
      {...questionText, ...correctAnswer}
    );}
  }
}

使用条件渲染:

// Conditional rendering works, but yuck!
// One condition per state works
// but can be unnecessarily verbose
getHeader() {
  switch(this.state.headerSize){
    case 1:
      return 

{ this.state.headerText };

case 2: return

{ this.state.headerText }

. . . default: return null; } } render (){ return { this.getHeader() }; // bound correctly in constructor of course :) }

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有