如何使用与其他 JSON 对象的一个公共属性来获取一个 JSON 的特定属性?

学习者

我是 react.js 的新手,在执行以下任务时遇到问题。

按照代码运行时,它显示setState无法使用并且应用程序中断。我有这两个对象,obj2生成一个表3 columns我需要做的每个单元definition列哪些不是null点击,然后落在我到team_wiki这是目前在链接obj1

obj1: {
    providers : [
         {team_name : "XYZ", team_wiki : "https://example.com", team_id : 1},
         {team_name : "ABC", team_wiki : "null", team_id : 2},
         {team_name : "LMN", team_wiki : "https://example2.com", team_id : 3},
         {team_name : "MNO", team_wiki : "https://example3.com", team_id : 4}
    ]
}

obj2: {
    products : [
       {team_name : "XYZ", definition : "this team handles XYZ products", metric_id : 101},
       {team_name : "ABC", definition : "this team handles ABC products", metric_id : 201},
       {team_name : "LMN", definition : "this team handles LMN products", metric_id : 301},
       {team_name : "MNO", definition : "this team handles MNO products", metric_id : 401}
    ]
}

代码:

state = {
    API_DATA : {},
    TEAM_WIKI : ''
}

componentDidMount(){
   // fetch the obj1 data and sets it to the state called API_DATA
}

wikiLink = (TEAM_NAME) {
   // getting TEAM_NAME from a component inside the render method
   const wiki = this.state.API_DATA.map(provider => {
       if (provider.team_name = TEAM_NAME && provider.team_wiki !== null) {
           return provider.team_wiki
       }
   })
   .map(link => {
       if (link !== undefined) {
           return link
       }
   })

   this.setState({
      // TEAM_WIKI is a state { its a string } where i want to store the 
      //team_wiki at last
      TEAM_WIKI : wiki
   })
}

render() {

   return (
         // i want to use it something like this
        < href="this.state.TEAM_WIKI" onClick={this.wikiLink(TEAM_NAME)} />
   ) 
}
里夏特

我觉得当第一次渲染发生时,this.wikiLink是被调用,而不是作为引用传递为什么我这么认为?因为我在那里看到圆括号。该方法的主体包含对 的调用this.setState,这意味着组件的状态在渲染时被交换,这违反了组件生命周期。

考虑一个案例:

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      buttonClicked: false,
    };
    this.handleClickButton = this.handleClickButton.bind(this);
  }

  handleClickButton() {
    this.setState({
      buttonClicked: true,
    });
  }

  render() {
    return (
      <button onClick={this.handleClickButton()}>click me</button>
    );
  }
}

这儿存在一个问题!表达式this.handleClickButton()是一个函数调用。在其中,有一个状态更改指令。当代码尝试这样做时,React 会显示警告:

警告:setState(...):无法在现有状态转换期间更新(例如在render其他组件的构造函数中)。Render 方法应该是 props 和 state 的纯函数;构造函数的副作用是一种反模式,但可以移至componentWillMount.

我们真正想要的是this.handleClickButton在按钮单击时调用该函数为此,我们需要将此函数的引用传递给onClickprop,如下所示:

  render() {
    return (
      <button onClick={this.handleClickButton}>click me</button>
    );
  }

注意没有圆括号。

那你应该怎么做呢?

有两种选择:

选项 1:onClick 中的匿名函数

而不是写作

render() {
   return (
     // i want to use it something like this
     <a href="this.state.TEAM_WIKI" onClick={this.wikiLink(TEAM_NAME)} />
   );
}

render() {
   return (
     // i want to use it something like this
     <a href="this.state.TEAM_WIKI" onClick={() => this.wikiLink(TEAM_NAME)} />
   );
}

这样,每次调用render组件实例的方法时,都会传递对就地声明的匿名函数的引用然后,当用户决定单击时,将在某个不可预测的时间点调用此函数,即分派“单击”类型的 MouseEvent。

选项 2:使 this.wikiLink(•) 返回一个函数!

函数返回函数的概念通常被称为部分应用程序,或者在与此类似的情况下更常见的是闭包因此,该wikiLink函数将而不是这样:

wikiLink(TEAM_NAME) {
  // getting TEAM_NAME from a component inside the render method
  const wiki = this.state.API_DATA.map(provider => {
    if ((provider.team_name = TEAM_NAME && provider.team_wiki !== null)) {
      return provider.team_wiki;
    }
  }).map(link => {
    if (link !== undefined) {
      return link;
    }
  });

  this.setState({
    // TEAM_WIKI is a state { its a string } where i want to store the
    //team_wiki at last
    TEAM_WIKI: wiki
  });
}

看起来像这样:

wikiLink(TEAM_NAME) {
  return () => {
    // getting TEAM_NAME from a component inside the render method
    const wiki = this.state.API_DATA.map(provider => {
      if ((provider.team_name = TEAM_NAME && provider.team_wiki !== null)) {
        return provider.team_wiki;
      }
    }).map(link => {
      if (link !== undefined) {
        return link;
      }
    });

    this.setState({
      // TEAM_WIKI is a state { its a string } where i want to store the
      //team_wiki at last
      TEAM_WIKI: wiki
    });
  };
}

这样当它被调用时,它会返回一个新函数。因为onClickprop 需要接收一个函数,所以我们解决了类型匹配的问题。因为我们调用wikiLink了一些参数,TEAM_NAME并且每次执行该函数时都会应用该参数,所以我们解决了保留上下文的问题。这不是很棒吗!


要更好地了解使用返回函数的函数,请查看此 Codesandbox,第 16 到 23 行。希望它能够让您了解在需要管理 React 组件状态的情况下如何利用闭包。

干杯!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将一个类的所有公共属性获取为json?

来自分类Dev

使用json模式验证对象的一个属性

来自分类Dev

如何从.net核心中的大型JSON对象获取一个属性?

来自分类Dev

如何从包含四个属性的JSON对象制作一个包含两个属性的JSON对象

来自分类Dev

通过给定的一个获取另一个 JSON 对象属性

来自分类Dev

基于公共属性合并2个json数组对象

来自分类Dev

基于公共属性合并2个json数组对象

来自分类Dev

如何基于另一个属性获取JSON属性

来自分类Dev

如何遍历具有嵌套属性的 JSON 对象,操作并返回一个新对象?

来自分类Dev

AngularJS:如何使用对象的键来获取另一个JSON对象的值

来自分类Dev

如何首先在 UI 中显示 JSON 对象中的最后一个属性

来自分类Dev

如何查询同一个json对象数组中的多个属性?

来自分类Dev

使用存储在其中一个属性中的字符串格式的另一个 json 对象解析 json 对象

来自分类Dev

有没有一种方法可以在Rails中使用Fast JSON API来选择外部对象的一个属性?

来自分类Dev

如何从Angular.js中的JSON获取某些属性中的最后一个值

来自分类Dev

在WCF REST服务中使用typeof时,在JSON中获取一个额外的属性

来自分类Dev

使用jq获取基于json中另一个属性的键列表

来自分类Dev

如何访问嵌套在另一个json响应的['error']属性中的json属性?

来自分类Dev

使用Json访问特定属性

来自分类Dev

如何基于另一个JSON属性有条件地反序列化JSON对象?

来自分类Dev

在其他JSON对象Flutter中获取一个JSON List对象

来自分类Dev

如何与其他json对象的值进行比较

来自分类Dev

2如何使用UnderscoreJs比较2个JSON的所有属性(一个除外)?

来自分类Dev

使用javascript根据一个公共属性对多个数组进行分组

来自分类Dev

如何使用键从json数组中获取json对象属于一个json对象

来自分类Dev

创建一个新的JSON数组,其中包含来自另一个JSON的特定属性

来自分类Dev

如何防止 JSON 解析错误:我的 RootObject 类将一个属性定义为“long”,但有时我会得到一个“对象”

来自分类Dev

Json模式。如何基于另一个属性值验证属性键?

来自分类Dev

如何基于另一个属性的值访问嵌套的JSON属性?

Related 相关文章

  1. 1

    如何将一个类的所有公共属性获取为json?

  2. 2

    使用json模式验证对象的一个属性

  3. 3

    如何从.net核心中的大型JSON对象获取一个属性?

  4. 4

    如何从包含四个属性的JSON对象制作一个包含两个属性的JSON对象

  5. 5

    通过给定的一个获取另一个 JSON 对象属性

  6. 6

    基于公共属性合并2个json数组对象

  7. 7

    基于公共属性合并2个json数组对象

  8. 8

    如何基于另一个属性获取JSON属性

  9. 9

    如何遍历具有嵌套属性的 JSON 对象,操作并返回一个新对象?

  10. 10

    AngularJS:如何使用对象的键来获取另一个JSON对象的值

  11. 11

    如何首先在 UI 中显示 JSON 对象中的最后一个属性

  12. 12

    如何查询同一个json对象数组中的多个属性?

  13. 13

    使用存储在其中一个属性中的字符串格式的另一个 json 对象解析 json 对象

  14. 14

    有没有一种方法可以在Rails中使用Fast JSON API来选择外部对象的一个属性?

  15. 15

    如何从Angular.js中的JSON获取某些属性中的最后一个值

  16. 16

    在WCF REST服务中使用typeof时,在JSON中获取一个额外的属性

  17. 17

    使用jq获取基于json中另一个属性的键列表

  18. 18

    如何访问嵌套在另一个json响应的['error']属性中的json属性?

  19. 19

    使用Json访问特定属性

  20. 20

    如何基于另一个JSON属性有条件地反序列化JSON对象?

  21. 21

    在其他JSON对象Flutter中获取一个JSON List对象

  22. 22

    如何与其他json对象的值进行比较

  23. 23

    2如何使用UnderscoreJs比较2个JSON的所有属性(一个除外)?

  24. 24

    使用javascript根据一个公共属性对多个数组进行分组

  25. 25

    如何使用键从json数组中获取json对象属于一个json对象

  26. 26

    创建一个新的JSON数组,其中包含来自另一个JSON的特定属性

  27. 27

    如何防止 JSON 解析错误:我的 RootObject 类将一个属性定义为“long”,但有时我会得到一个“对象”

  28. 28

    Json模式。如何基于另一个属性值验证属性键?

  29. 29

    如何基于另一个属性的值访问嵌套的JSON属性?

热门标签

归档