ReactJs 和 Typescript,使用 TSX 时如何更改对象内变量的状态

Posted

技术标签:

【中文标题】ReactJs 和 Typescript,使用 TSX 时如何更改对象内变量的状态【英文标题】:ReactJs and Typescript, how to change the state of a variable inside an Object when using TSX 【发布时间】:2019-04-11 23:32:04 【问题描述】:

我试图通过在 typescript 中切换每个 Object 数组中的 isOpen 来应用以下 reactstrap 下拉列表。我从 redux 收到一个具有以下结构的对象,Object.InnerObject.Array[isOpen,isOpen,...] 我试图触发该数组中的切换,但打字稿限制我执行以下操作。我有以下对象处于状态:

totalWorkload: 
      userId: 'd3d4',
      cost: 3,
      options: [
        
          optionTitle: 'dedew',
          optionDescription: 'fewfw',
          options: [],
          isOpen: false,
          selectedOption: ''
        
      ]
    

我试图在以下组件的选项数组中切换 isOpen:

export const Options = props => (
  <div>
    console.log(typeof props.totalWorkloadOptions.isOpen)
    console.log(typeof props.toggleDropDown
    <Dropdown isOpen=props.totalWorkloadOptions.isOpen toggle=() => props.toggleDropDown(props.totalWorkloadOptions.optionTitle)>
      <DropdownToggle caret>props.totalWorkloadOptions.optionTitle</DropdownToggle>
      <DropdownMenu>
        props.totalWorkloadOptions.options.map(op => (
          // tslint:disable-next-line:no-invalid-this
          // tslint:disable-next-line:jsx-no-lambda
          <DropdownItem key=op data-key=op onClick=() => props.appendChoiceList(props.totalWorkloadOptions.optionTitle, op)>
            op
          </DropdownItem>
        ))
      </DropdownMenu>
      <strong> props.totalWorkloadOptions.optionDescription </strong>
    </Dropdown>
    <br />
  </div>
);

问题是当我到达这里时,我实际上无法设置传递的下拉列表的状态是打开:

toggleDropDown = optionTitle => 
      console.log("TITLE:" + optionTitle);
      const options = this.state.totalWorkload.options.map(item => 
        if (item.optionTitle === optionTitle) 
          this.setState( ...item, isOpen: !item.isOpen )
         else 
          return item;
        
      );
      return  options ;
    ;

【问题讨论】:

小提琴可以分享吗? 稍后我会为你做的,我只是现在不在我的电脑前 好的 np @Reacter23 【参考方案1】:

您需要通过构造新对象来正确设置状态。 TypeScript 期望您从 map 构造返回一个 option 类型的值。从if 语句中返回一个值,你应该很好。

toggleDropDown = optionTitle => 
      console.log("TITLE:" + optionTitle);
      const options = this.state.totalWorkload.options.map(item => 
        if (item.optionTitle === optionTitle) 
          return  ...item, isOpen: !item.isOpen 
         else 
          return item;
        
      );
      let workLoad = ...this.state.totalWorkload, options;

      this.setState(...this.state, totalWorklaod: workload);
      return  options ;
    ;

【讨论】:

我已经尝试过了,它解决了我的错误,但是当我尝试切换它们时,我的下拉菜单仍然保持关闭状态。

以上是关于ReactJs 和 Typescript,使用 TSX 时如何更改对象内变量的状态的主要内容,如果未能解决你的问题,请参考以下文章

typesafe 使用 reactjs 和 typescript 选择 onChange 事件

缺少元素的“关键”道具。 (ReactJS 和 TypeScript)

ReactJs 和 Typescript,使用 TSX 时如何更改对象内变量的状态

ReactJS 和 Typescript :引用一个值,但在此处用作类型 (TS2749)

TypeError:fs.​​existsSync 不是函数(Electron/ReactJS/Typescript)

在 ReactJS + Typescript 中加载 CSS 模块并重新连接反应