【问题标题】:React functional component with useState hook executes function immediately使用 useState 钩子反应功能组件立即执行功能
【发布时间】:2019-09-23 23:32:19
【问题描述】:

我有一个带有 useState 钩子的功能性 React 组件,我有一个包含五个文本输入字段的数组。输入字段的值以数组的形式注册在状态中。问题是,我想在每次输入内容时使用 onChange 侦听器更新 inputfields 数组。但是,一旦我加载页面,函数(onChange 侦听器)会立即在无限循环中执行......这是为什么呢?

const addDublette = props => {
    // constructor(props) {
    //     super(props);
    //     this.textInput1 =  React.createRef();
    // }
    const [actualState, changeState] = useState({
        showInputField: false,
        dublettenIDs: [],
        errorMessage: '',   
        inputFields: ['','','','',''],
    });  ....

我在状态下更新输入值的方法:

const handleDoublettenIDs = (event,index) => {     
        let idnumber = event.target.value;
        let newInputFields = [...actualState.inputFields];
        newInputFields.splice(index,1, idnumber);
        console.log(newInputFields);
        if (isNaN(idnumber)) {
            changeState({...actualState, errorMessage: 'ID is not a number'})
        } if (idnumber > 2147483647) {
            changeState({...actualState, errorMessage: 'Number can not be bigger than 2147483647!'})
        }        
        else {
            changeState({...actualState, inputFields: newInputFields, errorMessage: '' });
        }      
    }

我的返回渲染方法:

return (
<p>       
                {

                    actualState.inputFields.map((val,index) => (                        
                        <InputElement key={index} elemValue = {val} name={"input" +  index} onChangeListener={(event,index) => handleDoublettenIDs(event,index)} />
                        )
                    )
                }

                <p>{errorMessage}</p>
                <br />                    
                <p><button onClick = {handleInputs(props.anzeigeID)}>absenden</button></p>   
            </p>  ...)

我使用 props.onChangeListener 属性将 onChangeListener 方法传递给我的 InputElement 组件“onChange”方法...

const inputElement = (props) => (
    <p>
        <input 
            value ={props.elemValue}
            ref={props.reference}
            name={props.name}
            type="number" 
            max="2147483647"
            placeholder="Doubletten-ID" 
            onChange={props.onChangeListener}>            
        </input>
    </p>


)



export default inputElement

我认为问题可能出在循环更新依赖循环中,但我仍然没有找到在哪里以及如何...

【问题讨论】:

  • 尝试将onChange={props.onChangeListener} 更改为onChange={props.onChangeListener.bind(this)}
  • 你的handleInputs函数是做什么的?
  • @Phillip,我的 handleInputs 方法只是在使用输入值中的新数据单击按钮后执行某些数据库发布/获取方法的另一种方法

标签: javascript reactjs events state react-hooks


【解决方案1】:

问题是您执行功能的按钮组件上的onClick

<p><button onClick = {handleInputs(props.anzeigeID)}>absenden</button></p>

正确的做法是这样的

<p><button onClick = {() => handleInputs(props.anzeigeID)}>absenden</button></p>

【讨论】:

  • 嘿,非常感谢,这实际上是真正的问题;)。我想我是在立即执行该函数并进行不断的状态更新...
  • 你能否澄清或给我一个提示,我应该在哪里使用箭头函数,在哪里可以使用普通函数?我发现它真的很混乱,因为在类组件中,我只是将一个函数属性传递给处理程序,例如“{this.functionname}”,有时我必须传递一个箭头函数,因为在函数组件中,我不能使用它。函数名我必须只使用“函数名”(不传递引用),然后它会立即执行......这完全令人困惑
  • @user2774480 是的,当您在渲染周期中执行状态更新时会发生这种情况。您必须注意,当您编写 fn() 时,它会调用一个函数,而如果您编写 fn,它会将引用分配给事件、道具或变量。类似地,箭头函数将创建一个新函数,在调用该函数时将使用一些预定义的参数调用原始方法
  • 只有当你想在调用函数时将自定义参数传递给函数,并且当你想将函数引用分配给某个东西而不是调用它时,才必须使用箭头函数
【解决方案2】:

当您像这样调用“function()”时,实际上是在执行它。否则,当你通过引用'function'调用函数时,它会在被事件调用时执行,比如点击!

【讨论】:

  • 非常感谢,不知道我正在通过箭头函数语法创建一个新函数引用:()=&gt;fnct(param) 我认为这就像一个事件处理函数被立即执行;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多