ReactJS 基于用户选择渲染组件

Posted

技术标签:

【中文标题】ReactJS 基于用户选择渲染组件【英文标题】:ReactJS rendering components based on user select 【发布时间】:2018-11-02 22:58:31 【问题描述】:

所以我基本上一周大就可以做出反应,并且多年来没有编写任何 javascript 代码。所以请原谅我的无知。

问题 我创建了三个不同的组件类

 const CreatedDate = React.createClass(
  displayName: 'CreatedDate',
  propTypes: 
    name: 'CreateDate',
    from: React.PropTypes.string,
    to: React.PropTypes.string,
    format: React.PropTypes.string,
    onChange: React.PropTypes.func
  ,

//其余代码和函数

同样,我有一个与此类似的类,称为 ClientSignedDate 和 VerificationDate 所有这些都包含基本相同的输入道具,但从同一张表的不同列中获取数据。

在一个名为Filter的单独ParentClass中 我在这个类中创建了这些组件的数组

const dateOptions = [CreatedDate,ClientSignedDate,VerificationDate];

以前只有一个组件时可以工作

          <CreatedDate
            from=this.props.filter.createdDateFrom
            to=this.props.filter.createdDateTo
            onChange=this.handleCreatedDateChange
          />

我基本上想根据用户的选择来渲染组件,但我不知道该怎么做。类似于下面的 sn-p 但允许渲染的东西。

 <select>dateOptions.map(x => <option>x</option>)</select>

【问题讨论】:

你是在问如何渲染动态组件,而不是只使用静态 JSX?我就是这么理解你的问题的。 我想根据用户选择的内容来渲染采用相同道具的不同组件。 【参考方案1】:

而我基本上是想根据用户选择来渲染组件

最简单的方法是

 this.state.selection === 1 && <CreatedDate ... /> 
 this.state.selection === 2 && <ClientSignedDate ... /> 

等等。

编辑:根据附加信息,另一个选项是:

const dateOptions = [CreatedDate, ClientSignedDate, VerificationDate];
const Comp = dateOptions[this.state.selection];  // pick element

然后使用

<Comp 
    from=this.props.filter.createdDateFrom
    to=this.props.filter.createdDateTo
    onChange=this.handleCreatedDateChange
/>

【讨论】:

有人在没有任何反馈的情况下对这里的所有答案进行投票。感谢您的意见,我没有机会看到这个。 谢谢伙计。我能够通过你的代码。这真的很整洁。 我实际上对另外两个投了反对票,因为他们不明白你在问什么,因此给出了无用的答案。显然,我也被一个也不理解的人否决了。既然您告诉 hsz 他的解决方案运行良好,我想知道您到底为什么要在 &lt;option&gt; 元素中放置一个具有功能和属性的组件以及其他东西。我将您的示例代码解释为一般动态渲染的示例,并假设这实际上与&lt;option&gt; 内容无关。毕竟我错了吗?【参考方案2】:

React 组件必须是大写的。从那里您可以使用变量组件。

我最近引用了this question,它帮助了我。这不完全是您要问的,但它源于同一个问题。 This question 也是。

<select>dateOptions.map((Option, index) => <option key=`unique_$index`><Option /></option>)</select>

当您使用Array.map 时,请确保您的key 是唯一的。如果动态添加/删除Option 组件,在某些情况下使用简单的数组索引可能会遇到问题。阅读更多关于 here 的信息。

【讨论】:

有人在没有任何反馈的情况下对这里的所有答案进行投票。感谢您的意见,我没有机会看到这个。 哈哈不用担心。如果您最终使用它,如果遇到任何问题,请告诉我。【参考方案3】:

用户定义的组件必须大写才能呈现它们。

试试看:

<select>dateOptions.map(Option => <option><Option /></option>)</select>

还要记住为option 元素设置key 属性。

【讨论】:

有人在没有任何反馈的情况下对这里的所有答案进行投票。感谢您的意见,我没有机会看到这个。 @shashwatZing 不用担心。

以上是关于ReactJS 基于用户选择渲染组件的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户的操作系统有条件地渲染 ReactJS 内容

为啥 ReactJS 不在另一个组件中渲染一个组件?

使用 ReactJS 的 Datatables.net,在一列中渲染一个 ReactJS 组件

在等待在 ReactJS 渲染中获取数据时显示加载微调器

为什么选择我--ReactJS

Reactjs 异步渲染组件