Как обновить состояние из другого компонента?

Я использую реагирующую нативную и реагирующую навигацию для маршрутизации.

Как обновить состояние с другого компонента/страницы?

Домашний экран

export class HomeScreen extends Component {
  constructor(){
    this.state = {
      test: ''
    }
  }

  updateState = ()=>{
    this.setState({test:'new value'});
  }

 }



SideMenuScreen
import { HomeScreen } from "./home"; 

export class SideMenuScreen extends Component {

  updateHomeState = ()=>{
    let oHome = new HomeScreen(); 
    oHome.updateState();
  }

}

Мой App.js и конфигурация маршрутизации и бокового меню, как показано ниже:

import { createAppContainer, createDrawerNavigator } from "react-navigation";
import { SideMenuScreen } from "./screens/Sidemenu";
import { HomeScreen } from "./screens/Home";

export default class App extends Component {
  render() {
    return(
      <AppContainer></AppContainer>
    );
  }
}

const AppNavigator = createDrawerNavigator(
  {Home: HomeScreen, 
    other: otherpage},
  {
    contentComponent: SideMenuScreen
  }
);

const AppContainer = createAppContainer(AppNavigator);

updateState выполняется, но не обновляет состояние.

Вы визуализируете SideMenuScreen внутри HomeScreen?

Prabu samvel 08.04.2019 13:56

Нет бокового меню в контентном компоненте

Khurshid Ansari 08.04.2019 13:58

Итак, между двумя компонентами нет отношений родитель-потомок, верно?

Prabu samvel 08.04.2019 14:01

можете ли вы проверить вопрос.

Khurshid Ansari 08.04.2019 14:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
8
4
13 504
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

If you have to update from the child component

Вам нужно будет передать Handlers от компонента, который содержит состояние, чтобы обновить значения, дочерний компонент может использовать эти обработчики для обновления состояние.

If you have to update from some other location

Вам нужно будет сделать уровень повышен состояние и следовать тому же, что и выше.

УровеньВверхКомпонент

export class App extends Component {
  constructor(){
    this.state = {
      test: ''
    }
  }

  updateState = (values)=>{
    this.setState(values);
  }

  render(){
    return <div>
     <HomeScreen></HomeScreen>
     <SideMenuScreen updateState = {this.updateState}></SideMenuScreen>
     </div>
  }
 }

Спасибо, но нет отношения родитель-потомок

Khurshid Ansari 08.04.2019 13:44

Я хочу изменить состояние из бокового меню.

Khurshid Ansari 08.04.2019 13:44

Не тот ответ, который искал ОП, но абсолютно тот ответ, который я получил, поэтому +1. Спасибо!

Teekin 16.04.2020 22:23

Вы можете сделать это, используя ref.

HomeScreen 

export class HomeScreen extends Component {
  constructor(){
    this.state = {
      test: ''
    }
  }

  updateState = ()=>{
    this.setState({test:'new value'});
  }

 }



SideMenuScreen
import { HomeScreen } from "./home"; 

export class SideMenuScreen extends Component {

  updateHomeState = ()=>{
    this.homeScreen.updateState();
  }

render(){
return(
<HomeScreen ref = {(ele) => this.homeScreen = ele}/>
);
}

}

когда вы переходите к следующему экрану, передайте эту функцию в параметрах,

this.props.navigate("SideMenuScreen",{update:this.updateState});

И на экране вашего бокового меню, назовите это с помощью реквизита,

this.props.navigation.state.params.update();//you can pass params also if needed

Я открываю боковое меню, например this.props.navigation.openDrawer()

Khurshid Ansari 08.04.2019 13:42
Ответ принят как подходящий

Поскольку у вас нет отношения «родитель-потомок» между вашими компонентами... это можно сделать с помощью Редукционное действие

HomeScreen;

export class HomeScreen extends Component {
  constructor() {
    this.state = {
      test: ""
    };
  }

  componentWillReceiveProps(nextProps) {
    const { test: nextTest } = nextProps;
    const { test } = this.props;

    if (nextTest !== test) {
        this.setState({ test: nextTest });
    }
  }

}

const mapStateToProps = ({ yourReducerName: test }) => ({ test });
export connect(mapStateToProps)(HomeScreen);

import { HomeScreen } from "./home";
import { connect } from "tls";

class SideMenuScreen extends Component {
  updateHomeState = () => {
    const { updateHomeStateAction } = this.props;

    updateHomeStateAction({ test: 'New Value' });
  };
}

export default connect(null, { updateHomeStateAction })(SideMenuScreen);

@KhurshidAnsari Redux действительно подходит для решения такого рода проблем. redux.js.org/basics/basic-tutorial

user2343647 08.04.2019 14:50

Я много пробовал, но не могу найти решение. Теперь я собираюсь использовать избыточность, могу предложить простой пример избыточности.

Khurshid Ansari 24.04.2019 13:05

@KhurshidAnsari redux - очень мощный инструмент... Я думаю, было бы здорово, если бы вы когда-нибудь инвестировали в его изучение... не только для имеющегося варианта использования, но и для многих вариантов использования, которые, как я полагаю, вы собирается встретиться лицом к лицу... Тем не менее, поначалу Redux довольно сложно понять... но как только вы освоитесь, его будет очень легко настроить и использовать... Бесплатные уроки: youtube.com/results?search_query=redux+учебник Для платных (которые я настоятельно рекомендую) ... Стив Грайдер в udemy udemy.com/user/sgslo

Hend El-Sahli 25.04.2019 06:37

@KhurshidAnsari Желаем удачи!

Hend El-Sahli 25.04.2019 06:42

Другие вопросы по теме