【问题标题】:Disabling a button within a stateless component - react禁用无状态组件中的按钮 - 反应
【发布时间】:2018-08-17 19:56:28
【问题描述】:

我试图弄清楚如何在仅使用 prop 的无状态组件中设置禁用字段。无状态组件有一个输入字段,如果为空,我想禁用同一组件中的提交按钮。我能够通过对孩子的道具更新父母的状态,因此想保持它没有状态,但开始认为我可能需要它来检查按钮是否可以启用。

我已经尝试了使用 refs 等不同的方法。这是一个代码框项目,我有一个示例

https://codesandbox.io/s/840kkk03l

无状态道具是:

const Childprop = function(props) {
  function handleNameChange(e) {
    e.preventDefault();
    props.onNameChange(e.target.newName.value);
  }
  function checkDisabled() {
    var input = document.getElementById("input");
    if (input.value === "") {
      return true;
    } else {
      return false;
    }
  }
  return (
    <p>
      The logged in user is: {props.nameProp}
      <form onSubmit={handleNameChange}>
        <input name="newName" type="text" id="input" />
        <input type="submit" disabled={checkDisabled} />
      </form>
    </p>
  );
};

谢谢

【问题讨论】:

  • 您基本上需要状态才能使其工作(在此组件中或父组件中)。此外,当调用 checkDisabled 时,您不能假设 input#input 将在 DOM 中 - 请改用 ref。
  • 尝试过的 ref.. 似乎在 disabled={} 内的调用无法访问/未定义 ref

标签: javascript reactjs react-component


【解决方案1】:

我只使用本地状态作为输入的值。这将使它成为controlled component。

class Childprop extends React.Component {
    state = {
        newName: ''
    }

    handleNameChange = (e) => {
        e.preventDefault();
        props.onNameChange(this.state.newName);
        this.setState({ newName: '' });
    }

    render() {
        return (
            <div>
                The logged in user is: {props.nameProp}
                <form onSubmit={handleNameChange}>
                    <input name="newName" type="text" id="input" onChange={(e) => this.setState(e.target.value)} value={this.state.newName} />
                    <input type="submit" disabled={this.state.newName.length === 0} />
                </form>
            </div>
        );
    }
};

【讨论】:

【解决方案2】:

这是无法做到的。您的应用程序中的某些内容必须调用 setState、forceUpdate 或重新渲染根应用程序,以便再次调用您的无状态函数。

【讨论】:

  • 所以基本上,即使只用于 isDisabled,也要使用状态?我正在学习 React 并尝试将所有状态保留在容器组件中。
  • 我的意思是disabled 字面意思是“一个状态”.. 它是真或假.. 你不需要 input 值的唯一原因是 DOM 有它自己的内部状态你可以捎带,但在大多数 React 应用程序中,无论如何你都使用受控输入
【解决方案3】:

你可以让它像这样工作:https://codesandbox.io/s/rr6jw0xxko

唯一的问题是一旦按钮被禁用,就无法再次启用它,因为您不能再提交了。

我同意@azium 方式是 React 方式。

【讨论】:

  • 您提供的示例也没有预期的结果,但看起来我无论如何都应该使用状态。谢谢
猜你喜欢
  • 2018-07-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2016-09-12
  • 2017-11-15
  • 1970-01-01
相关资源
最近更新 更多