首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在react js中更新表单并不能跟踪所有属性的状态

在react js中更新表单并不能跟踪所有属性的状态
EN

Stack Overflow用户
提问于 2020-06-03 21:22:32
回答 1查看 38关注 0票数 1

我在更新值时遇到了问题。最初,我从父类获取值放入文本框中,然后,如果我想通过子组件更新表单中的值,它基本上应该设置子组件中的状态,并将更新后的值传递给API。但是现在,当我尝试更改文本框中的值时,它只更改了一个字符,并且没有跟踪所有道具的状态。我该如何解决这个问题呢?我尝试过使用defaultValue,它确实改变了值,但它无法跟踪状态的变化。

PS: updateToApi只是一个示例函数,它使用post将值更新到api中我的示例项目在这里是https://codesandbox.io/s/sad-perlman-ukb68?file=/src/parent.js

代码语言:javascript
运行
复制
#class Parent#

    import React from "react";
    import "./styles.css";
    import Child from "./child";

    class Parent extends React.Component {
      constructor() {
        super();
        this.state = {
          data: {
            username: ["mar"],
            name: [null]
          }
        };
      }
      updateToApi(data) {
        var username: data.username;
        var name: data.name;
      }

      render() {
        return (
          <Child data={this.state.data} updateToApi={this.updateToApi.bind(this)} />
        );
      }
    }
    export default Parent;


##class Child##
    import React from "react";
    import "./styles.css";
    import { Button } from "react-bootstrap";

    class Child extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          username: "",
          name: ""
        };
      }

      handleSubmit = e => {
        e.preventDefault();
      };

      handleChange = e => {
        const data = { ...this.state };
        data[e.currentTarget.name] = e.currentTarget.value;
        this.setState({ data });
      };

      render() {
        return (
          <>
            <form onSubmit={this.handleSubmit}>
              <label>
                Username:
                <input
                  type="text"
                  name="username"
                  value={
                    this.props.data.username !== "undefined"
                      ? this.props.data.username
                      : this.state.username
                  }
                  onChange={this.handleChange}
                />
              </label>
              <b />

              <label>
                Name:
                <input
                  type="text"
                  name="Name"
                  value={
                    this.props.data.name !== "undefined"
                      ? this.props.data.name
                      : this.state.name
                  }
                  onChange={this.handleChange}
                />
              </label>
              <br />
              <Button variant="primary" onClick={this.props.updateToApi} />
            </form>
          </>
        );
      }
    }
    export default Child;
EN

回答 1

Stack Overflow用户

发布于 2020-06-03 21:57:15

为什么你有两个不同的状态?您应该完全去掉您的子组件中的状态,并且只使用父组件的状态。将HandleChange函数也放入你的父组件中,并通过props向下传递。

更新

如果您想让输入中的更改可见,您可以将您的子组件中的onchange处理程序更改为

代码语言:javascript
运行
复制
handleChange = e => {
this.setState({
  [e.currentTarget.name] : e.currentTarget.value });

};

并将输入值直接转换为this.state.username

不过,我还是很难理解你到底想要做什么。输入字段有两个独立的条件状态太复杂了。想象一下,如果你的应用程序会更复杂一点呢?你已经迷失在调试这些东西上了:

代码语言:javascript
运行
复制
value={ this.props.data.username !== "undefined"
              ? this.state.username
              : this.state.username
          }

因此,我强烈建议您重新评估应用程序中的所有数据结构和数据流。你应该在你的应用程序中拥有最少的真理来源。理想情况下是一个。因此,只需在父组件中使用main状态,并向下传递所需的属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62173890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档