【问题标题】:React JSON mapped data. Trying to pass a setState variable from mapped function will not get the latest state on render反应 JSON 映射数据。尝试从映射函数传递 setState 变量将不会在渲染时获得最新状态
【发布时间】:2020-01-07 18:34:35
【问题描述】:

我正在开发 React SPA 并尝试使用过滤器呈现 JSON 数据。我有几个容器,每个容器都有一个类值。单击容器时,我试图将值传递给 setState。但是,当退出地图功能时,我无法更新新的状态更改。

我假设渲染状态没有得到更新。

import React, { Component } from "react";
import ListData from "../data/list.json";

class Levels extends Component {
  constructor(props) {
    super(props);
    this.state = { newFilter: "" };
    this.onClick = this.setFilter.bind(this);
  }

  setFilter = e => {
    console.log(e); //This returns the correct class.
    this.setState({ newFilter: e }); //This will not update
  };

  render() {
    console.log(this.state.newFilter); //This just returns the initial state of ''
    const activeTab = this.props.keyNumber;
    let levelFilter = ListData.filter(i => {
      return i.level === activeTab;
    });
    let renderLevel = levelFilter.map((detail, i) => {
      let short_desc;
      if ((detail.short || []).length === 0) {
        short_desc = "";
      } else {
        short_desc = <p>{detail.short}</p>;
      }

      return (
        <div
          className={`kr_sItem ${detail.class}`}
          data-value={detail.class}
          onClick={() => this.onClick(detail.class)}
          value={detail.class}
          key={i}
        >
          <h1>{detail.title}</h1>
          {short_desc}
          <img src={`${detail.img}`} />
        </div>
      );
    });

    console.log(this.state.newFilter);

    return (
      <div id="kr_app_wrapper">
        <div id="lOneWrapper">{renderLevel}</div>
        <div id="lTwoWrapper"></div>
      </div>
    );
  }
}

export default Levels;

这是组件中调用的代码:

import React, {Component} from 'react';
import Levels from './components/levels2';

import {
  Route,
  NavLink,
  HashRouter
} from "react-router-dom";
import LevelTwo from "./levelTwo";

class LevelOne extends Component{
    render(){

        return(
            <div id="lOneWrapper">
            <NavLink to='/Level2'><Levels keyNumber={1} /></NavLink>
            </div>
        )
    }
}
export default LevelOne;

【问题讨论】:

  • 目前还不清楚是什么问题。您正在记录 this.props.newFilter 这是一个永远不会设置的道具!?但是您还记录了this.state.newFilter,它应该在渲染中正确更新。
  • 感谢您的收获。我将上面的内容更新为 state 而不是 props。在我沮丧的某个地方,我更新了尝试不同的方式,但忘记将 console.log 切换回来。
  • 虽然你已经更新了代码,但问题描述仍然不清楚问题是什么?
  • 我会更新的。我有根据 JSON 文件中的数据加载的 Div。他们每个人都有一个我想作为过滤器传递的类。当我单击 div 时,该类传递给 setFilter 函数,但不会在我的渲染中更新。我正在尝试传递一个变量以根据选择过滤掉结果。

标签: javascript reactjs


【解决方案1】:

编辑:正如 cmets 中所指出的,绑定箭头函数是没有意义的,但它不会在此处导致错误,因此您的代码的其他部分肯定有其他事情发生。

问题是您试图绑定一个没有隐式this 的箭头函数。直接调用setFilter(无需将this 与箭头函数绑定)或将setFilter 函数更改为常规函数:

class Levels extends Component{
     constructor(props){
    super(props);
    this.state = {newFilter: ''};
    this.onClick = this.setFilter.bind(this);
  }


  setFilter(e) {
    console.log(e); //This returns the correct class.
    this.setState({newFilter: e}); //This will not update

  }

【讨论】:

  • 谢谢特拉维斯。即使进行了更新,我仍然返回原始状态。我不确定我是否走在正确的道路上,但我读过的所有内容似乎都指向批处理问题。是否存在导致状态在渲染上不更新的原因?
  • 不,我认为你过于复杂了,除非你在一些你没有发布的相关代码中做一些复杂的事情。但是,如果您能够在 setFilter 函数中看到正确的对象,那么当您调用 setState 时,它​​将适当地更新您的状态。
  • 试试这个.. this.setfilter = this.setfilter.bind(this)
  • 我已更新以添加我的其他文件。我仍然无法传回渲染。也许那里有我没有正确编码的东西?
  • 好的,感谢您的澄清。我将更新我的答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 2018-04-30
  • 2020-02-16
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2020-03-25
相关资源
最近更新 更多