React.js:输入为空时禁用按钮

Ste*_*rov 153 reactjs react-jsx

我是React.js的新手,对不起,如果这个问题听起来太愚蠢了.

我正在尝试在输入字段为空时禁用按钮.React的最佳方法是什么?

我正在做类似以下的事情:

<input ref="email"/>

<button disabled={!this.refs.email}>Let me in</button>
Run Code Online (Sandbox Code Playgroud)

它是否正确?

这不仅仅是动态属性的重复,因为我也很好奇将数据从一个元素传输/检查到另一个元素.

Jon*_*nan 237

你需要保持状态,输入的电流值(或它的值传递的变化通过一个回调函数到一个父母,或侧身,或<您的应用程序的状态管理解决方案,在这里>,使得它最终被传递回你的组件作为道具)所以你可以导出按钮的禁用道具.

使用状态的示例:

<meta charset="UTF-8">
<script src="https://fb.me/react-0.13.3.js"></script>
<script src="https://fb.me/JSXTransformer-0.13.3.js"></script>
<div id="app"></div>
<script type="text/jsx;harmony=true">void function() { "use strict";

var App = React.createClass({
  getInitialState() {
    return {email: ''}
  },
  handleChange(e) {
    this.setState({email: e.target.value})
  },
  render() {
    return <div>
      <input name="email" value={this.state.email} onChange={this.handleChange}/>
      <button type="button" disabled={!this.state.email}>Button</button>
    </div>
  }
})

React.render(<App/>, document.getElementById('app'))

}()</script>
Run Code Online (Sandbox Code Playgroud)

  • @Kayote对于React不正确。这些标记不是HTML,而是JSX。在JSX中,如果将属性分配为false,则在转换为HTML时将其完全删除。您只是忽略了上面的评论,说它运行得很好吗? (4认同)
  • 太棒了,示例运行和一切.很好的完整示例和漂亮的交互式演示,SO. (3认同)
  • @Kayote谢谢,如果我对评论的最后部分有些不礼貌,对不起。这真是漫长的一天。 (3认同)
  • 这是行不通的,因为“disabled”仅仅附加到一个元素上,就意味着该元素被禁用。这不是一个布尔值。请参阅:https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/disabled (2认同)
  • @BenBaron感谢您的澄清.我不记得我在哪里/如何使用它,但是,我遇到了一些问题.我正在推荐你的评论,以便其他人知道这种方法是基于人们经验的正确方法. (2认同)

Mar*_*man 8

另一种检查方法是内联函数,以便在每次渲染时检查条件(每个道具和状态更改)

const isDisabled = () => 
  // condition check
Run Code Online (Sandbox Code Playgroud)

这有效:

<button
  type="button"
  disabled={this.isDisabled()}
>
  Let Me In
</button>
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

<button
   type="button"
   disabled={this.isDisabled}
>
  Let Me In
</button>
Run Code Online (Sandbox Code Playgroud)


Gi1*_*er7 5

使用常量可以组合多个字段进行验证:

class LoginFrm extends React.Component {
  constructor() {
    super();
    this.state = {
      email: '',
      password: '',
    };
  }
  
  handleEmailChange = (evt) => {
    this.setState({ email: evt.target.value });
  }
  
  handlePasswordChange = (evt) => {
    this.setState({ password: evt.target.value });
  }
  
  handleSubmit = () => {
    const { email, password } = this.state;
    alert(`Welcome ${email} password: ${password}`);
  }
  
  render() {
    const { email, password } = this.state;
    const enabled =
          email.length > 0 &&
          password.length > 0;
    return (
      <form onSubmit={this.handleSubmit}>
        <input
          type="text"
          placeholder="Email"
          value={this.state.email}
          onChange={this.handleEmailChange}
        />
        
        <input
          type="password"
          placeholder="Password"
          value={this.state.password}
          onChange={this.handlePasswordChange}
        />
        <button disabled={!enabled}>Login</button>
      </form>
    )
  }
}

ReactDOM.render(<LoginFrm />, document.body);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<body>


</body>
Run Code Online (Sandbox Code Playgroud)