#javascript #reactjs
Вопрос:
Фон:
У меня есть компонент (компонент А), который включает в себя другой компонент (миколорпикер). Я пытаюсь установить/получить значение MyColorPicker из компонента A.
Проблема:
Я могу установить цвет фона, передав реквизит MyColorPicker
примерно так: <MyColorPicker background="#ff0000" />
.
Тем не менее, я хочу иметь возможность динамически обновлять фон (т. Е. В Зависимости от ввода пользователя), а не закодировать его в реквизит. Я также хочу иметь возможность получить текущее значение цвета фона в handleSubmit
функции в компоненте A.
Компонент A Код:
// imports...
function myFunctionA(props) {
const handleSubmit = useCallback(() => {
console.log(textOrSelectFields);
});
return (
<>
<Form onSubmit={handleSubmit}>
<MyColorPicker />
</Form>
</>
)
}
Код МиКолорПикера:
// imports...
class MyBlockPicker extends React.Component {
state = {
background: this.props.background,
};
handleChangeComplete = (color) => {
console.log(color);
this.setState({ background: color.hex });
};
render() {
return (
<BlockPicker
color={this.state.background}
onChangeComplete={this.handleChangeComplete}
triangle="hide"
/>
);
}
}
export default MyBlockPicker;
Есть какие-нибудь идеи о том, как здесь действовать? Спасибо!
Ответ №1:
Вы можете передать setState
функцию ребенку. Если вы используете компоненты класса, вы можете обернуть setState
их так, чтобы у ребенка был доступ только к ограниченному объему состояния.
т.е.
В моей функции
function myFunctionA(props) {
const [selectedColor, setSelectedColor] = useState(null)
const handleSubmit = useCallback(() => {
console.log(textOrSelectFields);
});
return (
<>
<Form onSubmit={handleSubmit}>
<MyColorPicker setSelectedColor/>
</Form>
</>
)
}
В МиКолорПикере
class MyBlockPicker extends React.Component {
state = {
background: this.props.background,
};
handleChangeComplete = (color) => {
console.log(color);
this.setState({ background: color.hex });
this.props.setSelectedColor(color.hex)
};
render() {
return (
<BlockPicker
color={this.state.background}
onChangeComplete={this.handleChangeComplete}
triangle="hide"
/>
);
}
}
export default MyBlockPicker;
Кстати, вы смешиваете компоненты класса и функциональные компоненты, что будет проблемой по мере роста базы кода…
Комментарии:
1. Спасибо за вашу помощь! Поэтому, чтобы вывести значение обратно из функции handleSubmit , я бы просто сделал
console.log(selectedColor);
, правильно? Спасибо также за комментарий о смешивании типов компонентов. Я займусь этим вопросом.2. Если вы хотите запустить какое-либо действие (например, console.log), у вас есть два варианта. Во-первых, оберните функцию
setSelectedColor
в функцию и в этом вызове функции выполните журнал консоли. Во-вторых, создайтеuseEffect
крючок , который слушаетslectedColor
, и консоль. журнал — это когда состояние меняется.3. Извините, я имел в виду, как мне получить доступ к текущему значению
MyColorPicker
изhandleSubmit
функции?4. О,
selectedColor
будет содержать значение после следующего рендеринга. (Очень грубый) потокsetState
-> >render
->state is now updated