У меня есть пара компонентов, которые тесно связаны друг с другом. Самый высокий компонент получает опору под названием options. Опора options передается через следующие компоненты и так далее.
Как лучше всего передавать изменения из вложенных компонентов друг в друга? В этом случае я бы не стал использовать сокращение.
Как контекст может решить мою проблему?





Этот пример будет работать для React16.3 и выше.
кликните сюда для проверки рабочего примера.
1. Главный родительский компонент
Context lets us pass a value deep into the component tree without explicitly threading it through every component. Create a context for the current theme (with "light" as the default).
const ThemeContext = React.createContext('light');
class App extends React.Component {
render() {
// Use a Provider to pass the current theme to the tree below.
// Any component can read it, no matter how deep it is.
// In this example, we're passing "dark" as the current value.
const theme = "dark";
return (
<ThemeContext.Provider value = {theme}>
<Toolbar />
</ThemeContext.Provider>
);
}
}
2. Родительский компонент
A component in the middle doesn't have to pass the theme down explicitly anymore.
function Toolbar(props) {
return (
<div>
<ThemedButton />
</div>
);
}
3. Дочерний компонент
function ThemedButton(props) {
// Use a Consumer to read the current theme context.
// React will find the closest theme Provider above and use its value.
// In this example, the current theme is "dark".
return (
<ThemeContext.Consumer>
{theme => <div>{theme}</div>}
</ThemeContext.Consumer>
);
}
Замените тема на параметры в вашем случае.
Для получения более подробной информации воспользуйтесь ссылкой на React doc. кликните сюда
Here you are getting data from state and passing options data to your component
const mapStateToProps = (state) => ({
options: state.options,
});
Here you are connecting your component from state
export default connect(
mapStateToProps,
null,
)(ChildComponent);
@siwymilek: - Это решит вашу проблему, если вы используете React 16.3. В приведенной ниже версии он будет работать по-другому. Какую версию вы используете.
Не совсем - работает только в одну сторону, пропуская опоры вниз. Так или иначе, я решил использовать сокращение с контекстом. В моем самом высоком компоненте я подписываюсь на хранилище и переопределяю значение контекста.
@siwymilek Прежде всего, если вы используете redux, тогда не нужно использовать контекстный api для реакции. один из способов использования контента, в котором вы передаете реквизиты из самого верхнего компонента и можете получить его в дочернем компоненте или вложенном дочернем компоненте. Другой использует redux, в котором вы можете отправлять действия и сохранять данные, после чего вы можете использовать метод connect из response-redux для получения данных хранилища.
Я сознательно использовал context api - это намного лучшее решение, чем передача props через многие компоненты ... и нет причин для подключения всех компонентов
@siwymilek Как вы сказали, вы переопределяете значение контекста, теперь я добавил код для redux для получения данных из магазина с использованием метода подключения response-redux для получения данных о параметрах
@siwymilek: - Это полностью зависит от вас и вашего варианта использования. Вы можете выбрать что угодно. Я использую оба метода в своем приложении.
Да, вы абсолютно правы - но я лучше воспользуюсь своим решением, в любом случае спасибо за помощь :)
Вы можете использовать
contextиз React или Redux. В чем проблема?