javascript - 停止输入重新渲染 onChange
问题描述
我将输入值捕获为状态,并在按钮提交时将结果添加到数组中。
我遇到的问题是每次我在输入字段中输入一个字符时,它都会在我点击提交按钮之前创建一个新数组。
以下是奇怪行为的屏幕截图。
这是我的代码:
import React, { Component } from "react";
import autoBind from "react-autobind";
let fixtures = [];
const submitFixture = (homeTeam, awayTeam) => {
fixtures.push({
homeTeam: homeTeam,
awayTeam: awayTeam
});
};
class CreateFixture extends Component {
constructor(props) {
super(props);
autoBind(this);
this.state = {
homeTeam: "",
awayTeam: ""
};
}
render() {
const { homeTeam, awayTeam } = this.state;
return (
<React.Fragment>
<p>Home Team</p>
<input
value={homeTeam}
onChange={e => {
this.setState({ homeTeam: e.target.value });
}}
/>
<p>Away Team</p>
<input
value={awayTeam}
onChange={e => {
this.setState({ awayTeam: e.target.value });
}}
/>
<button onClick={submitFixture(homeTeam, awayTeam)}>
Create fixture
</button>
{console.log(fixtures)}
</React.Fragment>
);
}
}
export default CreateFixture;
解决方案
您正在submitFixture
通过编写直接在渲染上调用您的函数onClick={submitFixture(homeTeam, awayTeam)}
。这样,每次重新渲染组件时,您都会向数组添加一个新元素。
submitFixture
您可以创建一个新的内联函数,改为在单击事件发生时调用。
<button onClick={() => submitFixture(homeTeam, awayTeam)}>
如果你想以fixtures
某种方式渲染,最好将它们置于组件状态。
例子
class CreateFixture extends React.Component {
state = {
homeTeam: "",
awayTeam: "",
fixtures: []
};
submitFixture = () => {
this.setState(({ homeTeam, awayTeam, fixtures }) => ({
fixtures: [...fixtures, { homeTeam, awayTeam }]
}));
};
render() {
const { homeTeam, awayTeam, fixtures } = this.state;
return (
<div>
<p>Home Team</p>
<input
value={homeTeam}
onChange={e => {
this.setState({ homeTeam: e.target.value });
}}
/>
<p>Away Team</p>
<input
value={awayTeam}
onChange={e => {
this.setState({ awayTeam: e.target.value });
}}
/>
<button onClick={this.submitFixture}>Create fixture</button>
<div>{JSON.stringify(fixtures)}</div>
</div>
);
}
}
ReactDOM.render(<CreateFixture />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
推荐阅读
- php - PHP:如何在 iframe 中使用不同域名的会话/cookie?
- entity-framework - Dotnet Core 5.0 - 实体框架 - 设计时迁移工作但完成时出错
- javascript - 使用 ElemMatch 更新 MongoDb
- opengl - 低分辨率帧缓冲区重复自身
- angular - 在选择标签中预先选择一个选项,该选项具有角度反应形式的 ngValue
- sql - DB2 中基于列值排序的查询
- python - matplolib 中具有不同 LaTeX 字体的大文件
- java - Spring Boot post api-org.postgresql.util.PSQLException:错误:“密码”列中的空值违反非空约束
- python - NLTK Brill 演示不会产生errors.out
- javascript - 解决 Promise 后渲染 JSX 元素