У меня такой компонент:
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>
);
}
}
Я хочу, чтобы кнопка была отключена, когда входное значение пусто. Но приведенный выше код не работает. Он говорит:
add-item.component.js: 78 Uncaught TypeError: невозможно прочитать значение свойства undefined
указывая на disabled={!this.input.value}
. Что я здесь делаю не так? Я предполагаю, что, возможно, ref еще не создается при выполнении render
метода. Если, так что же такое обходной путь?
источник
disabled
атрибут из DOM, если он установлен в значениеfalse
- это кроссбраузерно.В HTML
Все они сводятся к 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> ); }
источник
Вы не должны устанавливать значение ввода через refs.
Взгляните на документацию по компонентам контролируемой формы здесь - https://facebook.github.io/react/docs/forms.html#controlled-components
В двух словах
<input value={this.state.value} onChange={(e) => this.setState({value: e.target.value})} />
Тогда вы сможете управлять отключенным состоянием, используя
disabled={!this.state.value}
источник
Существует несколько типичных методов управления рендерингом компонентов в React.
Но я не использовал здесь ничего из этого, я просто использовал ссылку для пространства имен, лежащих в основе дочерних элементов компонента.
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'));
<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>
источник
this.input
не определено, пока неref
будет вызван обратный вызов. Попробуйте установитьthis.input
какое-то начальное значение в своем конструкторе.Из документации React по ссылкам , акцент мой:
источник
У меня была аналогичная проблема, оказалось, что для этого нам не нужны хуки, мы можем сделать условный рендер, и он все равно будет работать нормально.
<Button type="submit" disabled={ name === "" || email === "" || password === "" ? true : false } fullWidth variant="contained" color="primary" className={classes.submit}> SignUP </Button>
источник
очень простое решение - использовать
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>
Точно так же вы можете включить кнопку, используя
buttonRef.current.disabled = false
источник
просто добавь:
<button disabled={this.input.value?"true":""} className="add-item__button" onClick={this.add.bind(this)}>Add</button>
источник