ReactJS - setState 到多个元素

Posted

技术标签:

【中文标题】ReactJS - setState 到多个元素【英文标题】:ReactJS - setState to multiple elements 【发布时间】:2015-08-13 16:14:03 【问题描述】:

我正在尝试将多个组件的状态 (actiu) 设置为 false,通过类引用它们。当我从一行中单击一个标签时,如何实现这一点,该行中所有元素的 actiu 状态变为 false? 这是我的组件树:

有一些 Blade 模板语法可以生成每一行标签

var RespostesBox = React.createClass(
  render: function() 
    return (

<div className="form-group">
    <?php $zenbatu = 0; ?>
    @foreach($preguntes as $p)
        <div className="well">
             $p->preg 
             $p->help 
        </div>
        <?php $zenbatu++ ?>
        <?php for($j = 0; $j <= 10; ++$j)  ?>
            <LabelResp izena="resp $zenbatu " balioa=" $j " />
        <?php  ?>
    @endforeach
</div>

    );
  
);

var LabelResp = React.createClass(
    getInitialState: function() 
        return actiu: false;
    ,
    handleClick: function(event) 

        // 
        this.setState(actiu: true)

    ,
    render: function() 
        return (
            <label className=this.state.actiu ? "radio-inline amgrd actiu" :"radio-inline amgrd" onClick=this.handleClick>
            <input type="radio" name=this.props.izena value=this.props.balioa className=this.props.izena /> this.props.balioa
            </label>
        );
    
);


React.render(
  <RespostesBox />,
  document.getElementById('lespreguntes')
);

提前感谢您的帮助!

【问题讨论】:

当您可以将数据 ($preguntes) 序列化为 JSON 并在 JS 中处理所有内容时,我不明白为什么要将 PHP + Blade 与 javascript 混合使用...(您是顺便说一句,还混合了英语、加泰罗尼亚语和巴斯克语;) 【参考方案1】:

我建议您应该为 Row 创建另一个组件,该组件将是 LabelResp 组件的父组件和 ResosterBox 的子组件。然后在 ResosterBox 组件中设置 State 和 handleClick。

为了与行通信,您可以将每行的索引传递给 handleClick。也许这个doc可以帮助你

【讨论】:

【参考方案2】:

处理所有标签状态的最佳方法是让您的父 React 组件管理它们是否处于活动状态。这实际上是使用 React.js 的建议之一是尽可能地推动状态管理。

为了使用您的代码完成此操作,您需要一种方法来提醒RespostesBox 标签已通过点击处理程序中的回调属性激活。

当标签被激活时,盒子组件将传递处理程序以调用,然后从标签中添加和删除类。该属性可以简单地称为onActivate 或任何对您来说最有意义的名称:

var RespostesBox = React.createClass(
  highlightActiveLabel: function(labelIndex) 
    // Assuming you are using jQuery too
    $('.amgrd').removeClass('actui');
    $('#amgrd' + labelIndex).addClass('actui');
  ,
  render: function() 
    return (

      <div className="form-group">
        <?php $zenbatu = 0; ?>
        @foreach($preguntes as $p)
          <div className="well">
            $p->preg 
            $p->help 
          </div>
          <?php $zenbatu++ ?>
          <?php for($j = 0; $j <= 10; ++$j)  ?>
            <LabelResp onActivate=this.highlightActiveLabel izena="resp $zenbatu " balioa=" $j " />
          <?php  ?>
        @endforeach
      </div>

    );
  
);

您的标签组件在单击时会调用onActivate 属性。我还将添加一个 id 属性,以便我们可以定位父组件中的元素。

var LabelResp = React.createClass(
  handleClick: function(event) 

    // Make sure property exists
    if ( this.props.onActivate ) 
       this.props.onActivate(this.props.balioa);
    

  
  render: function() 
    return (
        <label id="amgrdthis.props.balioa" className="radio-inline amgrd" onClick=this.handleClick>
          <input type="radio" name=this.props.izena value=this.props.balioa className=this.props.izena /> this.props.balioa
        </label>
    );

);

这应该允许您将类添加到您的活动标签,而无需每个人都知道它需要停用其他标签。

【讨论】:

以上是关于ReactJS - setState 到多个元素的主要内容,如果未能解决你的问题,请参考以下文章

调用 setState 后 ReactJS 元素未更新

reactjs——解决setState异步问题

ReactJS - setState Axios POST 响应

Axios ReactJS - 无法读取未定义的属性“setState”

ReactJS Array.push 函数在 setState 中不起作用

ReactJs setState 更新与输入框中输入的内容不同步