【问题标题】:How to trigger an onChange event on an input when its value changed by code in React?当 React 中的代码更改其值时,如何在输入上触发 onChange 事件?
【发布时间】:2019-11-05 12:13:03
【问题描述】:

我正在尝试学习 React JS,并且正在从事个人项目。我被卡住了,因为我无法将子组件中输入字段的值传递给父组件的状态。

我尝试使用 onChange 事件,但由于某种原因,它调用的函数 handleChange 没有被触发。

这是来自父组件的 sn-p:

class App extends Component {
    state = {
        myArray: [{ //myArray is being updated by another child component, which sets the values for id and amount; this works fine
                id: 1,
                amount: 12
            },
            {
                id: 2,
                amount: 23
            }
        ]
        total: 0 //expected value for total is 35
    };

    handleChange = e => {
        const { name, value } = e.target
        this.setState({
            [name]: value
        });
    }

    render() {
        return ( 
            <Child 
            handleChange={this.handleChange}
            myArray={this.state.myArray} />
            )
        }
    }

这是来自 Child 组件的 sn-p:

class Child extends Component {

    render() {
        const { myArray, handleChange } = this.props;

        const totalAmount = myArray.reduce(function (a, b) {
            return a + b.amount;
        }, 0);

        return (
        <div>
            <label htmlFor="total"> Total Amount: </label>
            <input id="total"
            name="total"
            type="number"
            placeholder="0.00"
            value={totalAmount}
            onChange={e => handleChange(e)}
            /> 
        </div>
        )
    }
}

总输入字段的值正确呈现。 但是,我想要实现的是每次更改此输入字段值时(当其他子组件更新 myArray 值并因此总和也发生更改时),我希望更新父组件状态下的总值。

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

您正在立即执行callback,而不是传递event 对象。试试这样

onChange = {e => handleChange("total")(e)}

同样在handleChange 中,你的论点名称是错误的

handleChange = propertyName => e => {
    this.setState({
        [property]: e.target.value
    });
}

应该是

handleChange = property => e => {
    this.setState({
        [property]: e.target.value
    });
}

【讨论】:

  • 我忽略了参数名称,我已经更正了它。我已经修改了上面的帖子并尝试按照您所说的传递事件对象,但它仍然无法正常工作。 :(我在handleChange函数中添加了一些console.log,但它真的没有被触发。
  • 你能发一个沙盒吗?
  • 等等!当我手动更改“总计”文本字段时,我让它在 handleChange 中打印 console.log。但是我想要的是调用 handleChange 函数,即使这个“总计”文本字段中的值被另一个组件中的一些其他逻辑自动更新。我还应该为此使用 onChange 属性吗?
  • 这里是一个沙箱:codesandbox.io/s/quiet-framework-cu0gb?fontsize=14 ParentComponent.js 上的 handleChange 函数仍然没有被触发。
【解决方案2】:

您不需要手动传递字段名称,您可以从事件中获取它。首先为您的输入命名

<input name="total" ...etc >

然后,您可以在handleChange 中接收事件

handleChange = e => {
   const { name, value } = e.target
   this.setState({
       [name]: value
   )}
  }

你在子组件中的调用方式应该是

onChange={handleChange}

在此处查看代码 https://codesandbox.io/embed/unruffled-pascal-d5p2q?fontsize=14

为了更好的结构,最好将 childComponent2 放在 childComponent1 旁边。它只需要总道具。

【讨论】:

  • 别担心,如果你解决了这个问题,只需将此问题标记为已回答
  • 问题还是没有解决。 ParentComponent 上的 handleChange 函数仍未被触发。这是一个沙盒:codesandbox.io/s/quiet-framework-cu0gb?fontsize=14
  • 这是您在子组件中调用它的方式,请参阅更新的答案
  • 你的意思是 ./components/ChildComponent2.jsx 对吧?还是一样。我在 handleChange 函数中放置了一个控制台日志,控制台中没有打印任何内容。
  • 我仍然可以通过我分享的链接看到我的更改
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多