dKa*_*Kab 34 javascript reactjs
我有这个组件:
import React from 'react';
export default class AddItem extends React.Component {
add() {
this.props.onButtonClick(this.input.value);
this.input.value = '';
}
render() {
return (
<div className="add-item">
<input type="text" className="add-item__input" ref={(input) => this.input = input} placeholder={this.props.placeholder} />
<button disabled={!this.input.value} className="add-item__button" onClick={this.add.bind(this)}>Add</button>
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在输入值为空时禁用该按钮.但上面的代码不起作用.它说:
add-item.component.js:78 Uncaught TypeError:无法读取未定义的属性"value"
指着disabled={!this.input.value}.我在这里做错了什么?我猜测,当render执行方法时,可能还没有创建ref .如果,那么什么是workararound?
Fab*_*ltz 55
使用refs不是最佳实践,因为它直接读取DOM,最好使用React state.此外,您的按钮不会更改,因为组件未重新呈现并保持其初始状态.
每次输入字段更改时,您都可以setState与onChange事件侦听器一起使用以再次呈现组件:
// Input field listens to change, updates React's state and re-renders the component.
<input onChange={e => this.setState({ value: e.target.value })} value={this.state.value} />
// Button is disabled when input state is empty.
<button disabled={!this.state.value} />
Run Code Online (Sandbox Code Playgroud)
这是一个有效的例子:
class AddItem extends React.Component {
constructor() {
super();
this.state = { value: '' };
this.onChange = this.onChange.bind(this);
this.add = this.add.bind(this);
}
add() {
this.props.onButtonClick(this.state.value);
this.setState({ value: '' });
}
onChange(e) {
this.setState({ value: e.target.value });
}
render() {
return (
<div className="add-item">
<input
type="text"
className="add-item__input"
value={this.state.value}
onChange={this.onChange}
placeholder={this.props.placeholder}
/>
<button
disabled={!this.state.value}
className="add-item__button"
onClick={this.add}
>
Add
</button>
</div>
);
}
}
ReactDOM.render(
<AddItem placeholder="Value" onButtonClick={v => console.log(v)} />,
document.getElementById('View')
);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>
<div id='View'></div>Run Code Online (Sandbox Code Playgroud)
小智 18
在 HTML 中,
<button disabled/>
<buttton disabled="true">
<buttton disabled="false">
<buttton disabled="21">
Run Code Online (Sandbox Code Playgroud)
所有这些都归结为 disabled="true" 这是因为它为非空字符串返回 true。因此,为了返回 false,请在像this.input.value?"true":""这样的条件语句中传递一个空字符串。
render() {
return (
<div className="add-item">
<input type="text" className="add-item__input" ref={(input) => this.input = input} placeholder={this.props.placeholder} />
<button disabled={this.input.value?"true":""} className="add-item__button" onClick={this.add.bind(this)}>Add</button>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
小智 12
这是使用 React hooks 的功能组件变体。
我提供的示例代码应该足够通用,可以根据特定用例进行修改,或者对于任何搜索“如何禁用 React 中的按钮”的人来说。
import React, { useState } from "react";
const YourComponent = () => {
const [isDisabled, setDisabled] = useState(false);
const handleSubmit = () => {
console.log('Your button was clicked and is now disabled');
setDisabled(true);
}
return (
<button type="button" onClick={handleSubmit} disabled={isDisabled}>
Submit
</button>
);
}
export default YourComponent;
Run Code Online (Sandbox Code Playgroud)
非常简单的解决方案是使用useRef钩子
const buttonRef = useRef();
const disableButton = () =>{
buttonRef.current.disabled = true; // this disables the button
}
<button
className="btn btn-primary mt-2"
ref={buttonRef}
onClick={disableButton}
>
Add
</button>
Run Code Online (Sandbox Code Playgroud)
同样,您可以通过使用启用该按钮buttonRef.current.disabled = false
您不应该通过ref设置输入的值。
在这里查看受控表单组件的文档-https: //facebook.github.io/react/docs/forms.html#受控组件
简而言之
<input value={this.state.value} onChange={(e) => this.setState({value: e.target.value})} />
Run Code Online (Sandbox Code Playgroud)
然后,您将可以通过使用来控制禁用状态 disabled={!this.state.value}
但是,我在这里没有使用任何这些,我只是使用了 ref 的命名空间底层子组件的组件。
class AddItem extends React.Component {
change(e) {
if ("" != e.target.value) {
this.button.disabled = false;
} else {
this.button.disabled = true;
}
}
add(e) {
console.log(this.input.value);
this.input.value = '';
this.button.disabled = true;
}
render() {
return (
<div className="add-item">
<input type="text" className = "add-item__input" ref = {(input) => this.input=input} onChange = {this.change.bind(this)} />
<button className="add-item__button"
onClick= {this.add.bind(this)}
ref={(button) => this.button=button}>Add
</button>
</div>
);
}
}
ReactDOM.render(<AddItem / > , document.getElementById('root'));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>
<div id="root"></div>Run Code Online (Sandbox Code Playgroud)