当前位置: 首页 > 面试题库 >

在React.js中触发子项重新渲染

金阳曜
2023-03-14
问题内容

Parent(MyList在我的示例中)组件通过Child(MyComponent)组件呈现一个数组。父级决定更改数组中的属性,React触发子级重新渲染的方式是什么?

this.setState({});调整数据后,我想出的只是在Parent中。这是触发更新的hack还是React方法?

JS小提琴:https:
//jsfiddle.net/69z2wepo/7601/

var items = [
  {id: 1, highlighted: false, text: "item1"},
  {id: 2, highlighted: true, text: "item2"},
  {id: 3, highlighted: false, text: "item3"},
];

var MyComponent = React.createClass({
  render: function() {
    return <div className={this.props.highlighted ? 'light-it-up' : ''}>{this.props.text}</div>;
  }
});

var MyList = React.createClass({
  toggleHighlight: function() {
    this.props.items.forEach(function(v){
      v.highlighted = !v.highlighted;
    });

    // Children must re-render
    // IS THIS CORRECT?
    this.setState({});
  },

  render: function() {
    return <div>
      <button onClick={this.toggleHighlight}>Toggle highlight</button>
      {this.props.items.map(function(item) {
          return <MyComponent key={item.id} text={item.text} highlighted={item.highlighted}/>;
      })}
    </div>;
  }
});

React.render(<MyList items={items}/>, document.getElementById('container'));

问题答案:

这里的问题是您要在中存储状态,this.props而不是this.state。由于此组件是mutating
items,因此items为state,应存储在中this.state。(这是有关道具与状态的很好的文章。)这解决了渲染问题,因为更新items时会调用setState,它将自动触发重新渲染。

这是使用状态而不是prop的组件的外观:

var MyList = React.createClass({
    getInitialState: function() {
        return { items: this.props.initialItems };
    },

    toggleHighlight: function() {
        var newItems = this.state.items.map(function (item) {
            item.highlighted = !item.highlighted;
            return item;
        });

        this.setState({ items: newItems });
    },

    render: function() {
        return (
            <div>
                <button onClick={this.toggleHighlight}>Toggle highlight</button>
                { this.state.items.map(function(item) {
                    return <MyComponent key={item.id} text={item.text} 
                             highlighted={item.highlighted}/>;
                }) }
            </div>
        );    
    }
});

React.render( <MyList initialItems={initialItems}/>,
              document.getElementById('container') );

请注意,我将itemsprop
重命名为initialItems,因为它很清楚MyList会对其进行突变。这是文档建议的。

您可以在这里看到更新的小提琴:https://jsfiddle.net/kxrf5329/



 类似资料:
  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 我已经初始化了一个数组状态,当我更新它时,我的组件不会重新渲染。以下是一个最低限度的概念证明: 根据这段代码,似乎输入应该包含要开始的数字0,并且无论何时更改,状态也应该更改。在输入中输入“02”后,应用程序组件不会重新渲染。但是,如果我在5秒后执行的onChange函数中添加setTimeout,则表明数字确实已更新。 对为什么组件不更新有什么想法吗? 这是一个带有概念证明的代码沙盒。

  • 问题内容: 我一直在尝试了解新的React Context API并正在使用它。我只是想检查一个简单的案例-更新提供者的数据时,所有这些都会重新呈现。 在Codesandbox上 查看 这个小例子 因此,在我的示例中,我有一个组件-其状态如下所示- 我创建了一个新的从这里包含语境做出反应,并从国家和值传递给两位消费者和。 所以我的假设是,如果随机数更新,它将更改上下文,并且两个组件都应触发重新渲染

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长

  • 问题内容: 我正在尝试使用新的Hooks从类组件转变为功能组件。但是,感觉与类组件中的类函数不同,我将获得不必要的子代渲染。 下面有两个相对简单的片段。第一个是我的示例编写为类,第二个是我的示例重写为功能组件。目的是使功能组件获得与类组件相同的行为。 类组件测试用例 功能组件测试用例 在第一个(类组件)中,我可以通过红色块更新计数,而无需重新渲染任何一个块,并且我可以通过橙色块自由地控制台记录当前