Задать вопрос
@hdhc

Почему не работает компонент React?

Есть форма GreeterForm, которая запрашивает имя.
При сабмите это имя должно подставляться в GreeterMessage после Hello.
В чем косяк?

class Greeter extends React.Component {
	constructor(props) {
		super(props);
		this.handleNewName =  this.handleNewName.bind(this);
		this.state = {
			name: this.props.name
		};
	}
	static defaultProps = {
		name: 'user',
		message: 'This is a default message'
	}
	handleNewName(name) {
		this.setState({
			name: name
		});
	}
	render() {
		let name = this.state.name,
			message = this.props.message;
		return (
			<div>
				<GreeterMessage />
				<GreeterForm onNewName={this.handleNewName} />
			</div>
		);
	}
}

class GreeterMessage extends Greeter {
	constructor(props) {
		super(props);
	}
	render() {
		let name = this.props.name;
		return(
			<div>
				<h1>Hello {name}!</h1>
				<p>Some text</p>
			</div>
		);
	}
}

class GreeterForm extends Greeter {
	constructor(props) {
		super(props);
		this.onFormSubmit = this.onFormSubmit.bind(this);
	}
	onFormSubmit(e) {
		e.preventDefault();

		let name = this.refs.name.value;

		if(name.length > 0) {
			this.refs.name.value = '';
			this.props.onNewName(name);
		}
	}
	render() {
		return (
			<form onSubmit={this.onFormSubmit}>
				<input type="test" ref="name" />
				<button>Set Name</button>
			</form>
		);
	}
}

let name = 'User';

ReactDOM.render(
	<Greeter name={name} />,
	document.getElementById('app')
)
  • Вопрос задан
  • 397 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
miraage
@miraage
Старый прогер
Общие косяки:

1) Дублировать props в state - моветон. Используйте defaultValue на инпутах.
2) Строковые рефы - моветон. И вообще, тут рефы не нужны - по изменению инпута нужно отдавать значение родителю через коллбэк, принятый в props

По данному примеру

1) Greeter в методе render не передает нужные props дочерним компонентам
2) Внутри компонента формы храните состояние и передавайте его в props.onSubmit

Небольшой оффтоп

Вместо привязки контекста функции в конструкторе можно писать так:

class Foo {
  onSubmit = (event) => {
    // "this" is correct instance
  };
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы