javascript - 即使将更新的值从父级传递给子级后,子级也不会呈现

标签 javascript reactjs

在父组件中,我从服务器接收数据,然后将这些数据映射为 jsx 格式。在这个映射中,我有一个子组件,并尝试将一个值从父组件的状态传递给子组件作为属性,但是当我更新该值的状态时,子组件的渲染函数不会被执行。

预期行为:作为用户,我看到一个项目列表。如果我点击一个项目,它应该变成选中状态。

export class ReactSample extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      items: [],
      mappedItems: [],
      selectedIds: [],
      isSelected: false,
      clickedTripId: null
    };

    this.toggleSelection = this.toggleSelection.bind(this);
  }

  componentWillMount(){
    console.log("Component mounting")
  }

  toggleSelection (id, e) {
    if(!_.includes(this.state.selectedIds, id)) {
      this.setState((state) => ({selectedIds: 
state.selectedIds.concat(id)}));
      this.setState(() => ({clickedTripId: id}));
      this.mapItems(this.state.items);
    }
  }

  componentDidMount() {
    const self = this;
    MyService.getItems()
      .then(res => {
        self.setState(() => ({ items: res.allItems }));
        self.setState(() => ({ mappedItems: 
this.mapItems(res.allItems) }));
      }
    )
  }

  mapItems (items) {
return items.map(trip => {
  return (
    <li key={trip.id} onClick={(e) => (this.toggleSelection(trip.id, 
e))}>
      <span>{trip.title}</span>
      <Tick ticked={this.state.clickedTripId}/>
      <span className="close-item"></span>
    </li>
  );
});
  }

  getItems() {

  }

  render() {
    return (
      <div>
        <a className="title">This is a react component!</a>
        <Spinner showSpinner={this.state.items.length <= 0}/>
        <div className="items-container">
          <ul id="itemsList">
            {this.state.mappedItems}
          </ul>
        </div>
      </div>
    );
  }
}


export class Tick extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    console.log('RENDER');
    return (<span className={this.props.ticked ? 'tick display' : 
'tick hide' }></span>);
  }
}

最佳答案

我发现了几个问题。

toggleSelection中,您没有对mapItems的结果执行任何操作。如果您只是从状态中删除 mappedItems 并在渲染方法中调用 mapItems,那么这种错误会更容易避免。

另一个问题是您将 this.state.clickedTripId 作为 ticked 属性传递。我假设您打算传递类似于 this.state.clickedTripId === trip.id 的内容。

关于javascript - 即使将更新的值从父级传递给子级后,子级也不会呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53946499/

相关文章:

javascript - jQuery/JavaScript 动态更改音频源

javascript - 如何在 react-chartjs-2 中更新图表?

javascript - 商店订阅在外部组件中不起作用

javascript - 类型错误:无法读取未定义的属性 'slug'

javascript - 通过 onSubmit 更改 React 中 Forms 的 CSS 样式

javascript - 如何在 jquery 函数中使用正则表达式修饰符?

javascript - 如何在多个订阅变量一起调用时只调用一次函数

javascript - 我的 Highchart 偶尔显示(绘制)我的数据,而不是从左到右以干净的线条显示

javascript - styled-components:扩展样式和改变元素类型

html - 如何根据子元素的数量添加按钮?