javascript - React this.props 不更新

标签 javascript arrays reactjs

有人可以帮我理解为什么 this.props 在我过滤后没有更新吗?

这是我的代码的精简版本

export default class AutoList extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      filterValue: 'all',
      isHidden: true,
      autoOptValue: ''
    }
  }

  handleOnChangeBrand(evt) {
    let selectedValue = evt.target.value;
    this.setState({optionValue: selectedValue});

    let filtered = this.props.autos.filter((auto) => {
      if(auto.brands){
        return auto.brands[0] === selectedValue;
      }
      return false;
    });
    console.log(this.props.auto) // still same number
    console.log(filtered) // less autos. Actual filtered array
  }

   render() {
    let autoDetail = this.props.autos.map(auto => {
      return (
        <Auto
          key={auto.id}
          id={auto.id}
          name={auto.name}
          brands={auto.brands ? auto.brands : false}/>
      );
    });

    return (
      <div>

        <section>
          <select id='autoFilter' className={this.state.isHidden ? 'u-is-hidden' : ''} onChange={this.handleOnChangeBrand.bind(this)} value={this.state.autoOptValue}>
            <option value='brand1'> brand1 </option>
            <option value='brand2'> brand2 </option>
          </select>
        </section>

        <ul>
          {autoDetail}
        </ul>
      </div>
    );
  }

所以基本上我有 this.prop.auto 是一个包含 100 个汽车的数组,每个都是一个带有品牌的对象(这是另一个数组),每个都有 2,3 个品牌。

我能够进行过滤,因为filtered给我返回了一个包含过滤后的自动的数组,即正确的数组。 但此后,this.props.auto 不会更新,UI 也不会更新。

我做了类似的事情,但是按品牌对汽车进行排序,并且运行顺利。 我不明白这里有什么区别

最佳答案

this.props 在组件内实际上是不可变的,因此您无法更新 this.props.autos 的值。 Array#filter 也是一个纯函数,因此被过滤的数组不会改变,但会返回一个过滤后的数组。这就是为什么当您在函数中记录 filtered 时,您会看到过滤后的数组,但 this.props.autos 未更改。

对此问题的简单答案是在渲染方法中进行过滤 - 我已为 optionValue 添加了 false 的初始状态,并在过滤器方法中检查此状态,如果是,则不进行过滤仍然是假的。

export default class AutoList extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      filterValue: 'all',
      isHidden: true,
      autoOptValue: '',
      optionValue: false
    }
  }

  handleOnChangeBrand(evt) {
    let selectedValue = evt.target.value;
    this.setState({optionValue: selectedValue});
  }

  render() {
    const { optionValue } = this.state;
    const autoDetail = this.props.autos
    .filter((auto) => {
      if (!optionValue) return true;
      if(auto.brands){
        return auto.brands[0] === optionValue;
      }
      return false;
    })
    .map(auto => {
      return (
        <Auto
          key={auto.id}
          id={auto.id}
          name={auto.name}
          brands={auto.brands ? auto.brands : false}/>
      );
    });

    return (
      <div>

        <section>
          <select id='autoFilter' className={this.state.isHidden ? 'u-is-hidden' : ''} onChange={this.handleOnChangeBrand.bind(this)} value={this.state.autoOptValue}>
            <option value='brand1'> brand1 </option>
            <option value='brand2'> brand2 </option>
          </select>
        </section>

        <ul>
          {autoDetail}
        </ul>
      </div>
    );
  }

关于javascript - React this.props 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058537/

相关文章:

javascript - 根据键将一个数组嵌套到另一个数组中

javascript - 如何使用 Expo 在 React Native 中设置 cookie?

javascript - 使用 Object.assign 正确返回嵌套状态

javascript - CoffeeScript - 数组过滤不起作用

javascript - 如何在 canvas 2D 中绘制这个形状并用颜色填充它?

javascript - 在javascript中创建一个函数,以相反的顺序返回数组和元素

javascript - 根据状态变化仅将样式应用于一个 div

javascript - redux dumb组件功能单元测试

javascript - 如何使用 JavaScript 从 div 中的输入字段获取输入值

javascript - 如何在 Amazon Lambda 中使用 .pem 文件访问 EC2 实例