当前位置: 首页 > 面试题库 >

移除输入组件时反应错误

魏鸿禧
2023-03-14
问题内容

我不确定这是否是个问题,但我在这个问题上苦苦挣扎。我试图创建一个简单的示例来发布我的项目:

https://codepen.io/as3script/pen/VMbNdz?editors=1111

该示例上有四个按钮。

要重现该问题,请按前三个按钮中的每个按钮以从中创建文本输入并输入一个值。例如,在第一个输入100,在第二个输入200,第三个输入300。现在按第四个按钮删除第一个输入。

它应该将第二和第三保持其各自的值200和300,但相反,它在第二和第二显示100。

此代码与CodePen上的代码相同,只是不允许在没有此链接的情况下发布链接。

class ButtonComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {filtersArr:[]}
    this.addButtons = this.addButtons.bind(this);
    this.removeButtons = this.removeButtons.bind(this);
    this.getInput = this.getInput.bind(this);
    this.onChangeHandler = this.onChangeHandler.bind(this);
  }

   addButtons(e){     
    let tempArr = this.state.filtersArr;

    tempArr.push({comp:this.getInput(e.target.id), id:e.target.id});

    this.setState({filtersArr:tempArr});
  }

  removeButtons(e){
    console.log(e.target.id);
    let newArr = this.state.filtersArr.filter((filter)=>{
      return (filter.id !=='FirstButton')
    })
    this.setState({filtersArr:newArr});
  }

  onChangeHandler(e){
    console.log(e.target.value);
  }

  getInput(id){
    return (
      <div>
        <h6>{id}</h6>
        <input
          id="min"
          type="text"
          placeholder="min"
          onChange={this.onChangeHandler}/>
      </div>
    )
  }

  render() {
    let styles = {
      display:'inline-block'
    }

    return (
      <div>
        <p>Add three buttons and enter the number in each input, and remove amt.</p>
        <button id="FirstButton" onClick={this.addButtons}>FirstButton</button>
        <button id="SecondButton" onClick={this.addButtons}>SecondButton</button>
        <button id="ThirdButton" onClick={this.addButtons}>ThirdButton</button>

        <button id="FirstButton" onClick={this.removeButtons}>Remove firstButton</button>

          <ul>
            {this.state.filtersArr.map((filter, index)=>{
              return <li style={styles} key={index}>{filter.comp}</li>
            })
            }
          </ul>
      </div>
    );
  }
}

ReactDOM.render(
  <ButtonComponent/>,
  document.getElementById('root')
);

问题答案:

问题是您将数组索引用作key,因此React将重用前两个li元素,并删除最后一个元素。更改key={index}key={filter.id},它会按预期工作。

关于注释和下注的更新:假定该字段为,我在实际代码中假定过滤器具有唯一性id。CodePen似乎更像是精简版来显示问题。但是,如果您确实希望让每个按钮创建多个文本字段,则确实需要添加一些额外的东西来区分键(例如计数器)。但是,这不会影响问题中所述的问题。

再次查看代码,我发现getInput将其提取到单独的(无状态)组件中是理想的选择,例如FilterInput。与将子渲染保持在组件状态相比,这更适合于react模型



 类似资料:
  • 问题内容: 我试图建立一个适当的反应输入复选框,选择所有组件。想法是有一个组件,并且我可以检查,所有组件也都将被选中。 我有两个问题。 如果选中,则无法取消选择任何一个。 如果已全部选中,则应进行检查。 这是例子。 问题答案: 我认为可能会对您的实现进行一些修改,以便以更具 React风格的 形式获得所需的结果。 首先要取消的是复选框类和该类的prop 。复选框是一个相对愚蠢的元素,它不应该了解诸

  • 我已经用ReactJS和ES6进行了几天的实验,并创建了两个组件,即

  • 问题内容: 我面临一个相当愚蠢的问题。我正在创建我的第一个React应用程序,遇到一个小问题,提交表单后,我无法清除输入值。尝试谷歌搜索此问题,在这里找到了一些类似的线程,但我无法解决。我不想更改组件/应用程序的状态,而只是将输入的值更改为空字符串。我尝试清除函数中输入的值,但出现错误: “无法设置未定义的属性’值’”。 我的SearchBar组件: 问题答案: 您有一个受控组件,其值由决定。因此

  • 我目前有我的项目文件夹 在我的主页组件中,我试图将整个配置文件目录导入这样一个对象(根据需要动态加载每个组件,但并非所有组件都将加载) 而且 但是我在编译器中得到一个错误,说模块未找到:无法解析“/轮廓 我想明确说明,配置文件是一个包含组件的文件夹,我想在我的app.js文件中选择所有要动态调用的组件。 为什么会这样?

  • 我遇到了一个奇怪的错误,我的搜索输入组件,它失去了对每个按键的关注,不知道为什么。 我还得到了一个

  • 问题内容: 我有以下反应成分 我该如何在rxjs上使用反跳功能? 问题答案: 您将需要从更改事件中爬出可观察到的位置(例如使用Subject),然后对此进行反跳。 这是为您提供功能齐全的示例:

  • 我必须发布{输入}数据以http://localhost:4000/predictionAxios。但是{输入}变为未定义。 我使用const而不是类Main扩展组件. onChange,它设置表单数据。 阿希奥斯邮报。 返回(表单)时带有onSubmit、onChange。

  • 问题内容: React建议转移道具。整齐! 我如何转移除一个以外的所有东西? 问题答案: 您可以使用以下技术来消耗一些道具并传递其余的道具: 资源