У меня есть два компонента: ParentComponent
и ChildComponent
.
. В ChildComponent
есть элемент input[type="text"]
, который, когда он меняет свой текст, это событие распространяется на ParentComponent
через событиеchange
и слушатель onChange
.
Приведенный ниже код упрощает более серьезную проблему, поэтому вы увидите некоторые требования, выделенные там.
Моя проблема , что мне нужно для запуска события change
внутри функции: handleClick
.Я провел несколько экспериментов без удачи.
Здесь у вас есть песочница с кодом , с которой вы можете поэкспериментировать (пожалуйста, предоставьте ответвление с вашим подходом):
https://codesandbox.io/s/wqw49j5krw
Здесь у вас есть код:
ParentComponent.js
import React from "react";
import ChildComponent from "./ChildComponent";
export default class ParentComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
name: "Peter"
};
}
handleChange = event => {
let target = event.target;
let value = target.value;
this.setState({
name: value
});
};
render() {
return (
<div>
<ChildComponent value={this.state.name} onChange={this.handleChange} /><br />
<span>Hello</span>
<span>{this.state.name}!</span>
</div>
);
}
}
ChildComponent.js
import React from "react";
import ReactDOM from "react-dom";
export default class ChildComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
value: this.props.value
};
}
handleChange = event => {
const name = event.target.value;
this.setState({ value: name });
if (this.props.onChange !== undefined) {
this.props.onChange(event);
}
};
handleClick = name => {
const inputName = this.refs.name;
console.log('Name before being changed: ' + inputName.value); // this works
// PROBABLY HERE IS WHERE THE CODE NEEDS TO BE MODIFIED
this.setState({ value: name });
var event = new Event('input', { bubbles: true });
inputName.dispatchEvent(event); // this doesn't propagate the event to the parent
};
render() {
return (
<div>
{"Your name: "}
<input type="text"
value={this.state.value}
onChange={this.handleChange}
ref="name"
/>
{/* requirement: the following 2 lines cannot be modified */}
<button onClick={e => { this.handleClick("Steve"); }}>Steve</button>
<button onClick={e => { this.handleClick("Emily"); }}>Emily</button>
</div>
);
}
}
Есть идеи, как заставить это работать?
Спасибо!