【问题标题】:React onChange function does not fire when passing it down to componentReact onChange 函数在传递给组件时不会触发
【发布时间】:2019-09-29 22:03:44
【问题描述】:

已解决请参阅下面的评论(只需将选择器和部分功能移到类组件之外即可使其工作。

所以我对 react onChange 函数有问题。当它作为道具传递给组件时,它似乎不起作用。我试图传递组件而不是数据,但它仍然不起作用。请考虑以下示例:

export default class Parent extends Component {
  constructor(props) {
    super(props)
    this.state = {
      type: '1',
      number: ''
    }
  }

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

  render() {
    return (
      <div className="App">
          <Form
            type={this.state.type}
            number={this.state.number}
            handleChange={this.handleChange}
          />
      </div>
      }
  }


//receiving the props
export default class Child extends Component {
        constructor(props) {
            super(props)
        }

        render() {
            const Chooser = ({ type, section }) => {
                switch (type) {
                    case '1':
                        return <Fragment>{section}</Fragment>
                    default:
                        return <Fragment>></Fragment>
                }
            }
            const Section = ({ number, handleChange }) => (
                <Fragment>
                    <div>
                        <label>Number</label>
                        <input
                            type='text'
                            name='number'
                            placeholder='123456789'
                            value={number}
                            onChange={handleChange}
                        />
                    </div>
                </Fragment>
            )

            return (
                <Chooser
                    type={this.props.type}
                    section={
                        <Section
                            number={this.props.number}
                            handleChange={this.props.handleChange}
                        />
                    }
                />
            )
        }
    }

有趣的是,如果我将 onChange 放在 Section 级别,它确实有效。但这不是我想要的,因为传递的组件可能有多个我想要传递的 Input 函数。

         return (
                <Chooser
                    type={this.props.type}
                    section={
                        <Section
                            number={this.pops.number}
                            onChange={this.pops.handleChange}
                        />
                    }
                />

知道如何使用道具传递 onChange 函数吗?在类似的示例中,输入更改确实有效,但每次按下值时都会失去焦点。已经尝试分配键,但也没有用。

【问题讨论】:

  • 你能分享一下你所说的输入改变失去焦点的类似例子的代码吗?

标签: reactjs input state


【解决方案1】:

这是因为你需要像 const {handleChange} = this.props.handleChange 那样在下一次像这样解构它

【讨论】:

    【解决方案2】:

    您目前将此作为您的 handleChange 方法

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

    你应该把它改成这个。

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

    您似乎访问了target 中的错误属性,因为namee.target.value 中始终是undefined,因此,调用setState 不会做任何事情。

    此外,您可能应该在类组件之外声明您的函数组件。

    【讨论】:

    • 感谢您的更新。我更新了这个例子。 onChange 函数现在正在工作,但每次我这样做时,输入字段都会失去焦点。
    • 将它移到类组件之外解决了谢谢!任何解释为什么这正是解决问题?
    • 这可能是因为您无法跟踪在渲染方法中创建的组件内的更改。一旦您在输入字段中进行更改,类组件将完全重新渲染,这导致没有任何更改向下传递,因为它将重新启动渲染中的组件
    【解决方案3】:

    您可以将handleChange() 包装在一个匿名函数中,这样它就会主动等待您对输入进行更改。否则它将在渲染时运行。

     const Section = ({ number, handleChange }) => (
                    <Fragment>
                        <div>
                            <label>Number</label>
                            <input
                                type='text'
                                name='number'
                                placeholder='123456789'
                                value={number}
                                onChange={(e) => handleChange(e)}
                            />
                        </div>
                    </Fragment>
                )
    

    【讨论】:

    • 感谢您的贡献。不幸的是,它没有解决我的示例中输入的“失去焦点问题”。任何改进的想法都会非常感激!
    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多