javascript - 如何使用 Context API 将一个状态和函数传递给多个不同的组件?

标签 javascript reactjs

我现在在 React 上工作了 6 个月。我现在才在解决这个问题,因为 Context API 对我来说还很新。我喜欢它,但我不知道如何正确使用它,来清理和优化我的 React APP。

我遇到了这个问题,我在每个组件中使用 Axios 获取数据,每个组件中具有相同的功能和相同的状态。

我实际上是复制粘贴..来访问我的数据,但我想用 Context API 来解决这个问题。

希望有人能帮助我,我想变得更好并理解这里的 Context API。

我的代码:

state = {
    social_media: [],
    page_home: [],
    loading: true,
};

getCoffee() {
    return new Promise(resolve => {
        setTimeout(() => resolve('☕'), 2000); // it takes half of a second to make coffee
    });
}

async showData() {
    try {
        const wpSocial = axios(`${ACF_DATA_URL}/options/social_media_data`);
        const wpHome = axios(`${WP_DATA_URL}/pages?slug=home`);

        await this.getCoffee();

        await Promise.all([wpSocial, wpHome]).then(response => {
            this.setState({
                social_media: response[0].data.social_media_data,
                page_home: response[1].data[0],
                loading: false,
            });
        });
    } catch (e) {
        console.error(e); // 💩
    }
}

componentDidMount() {
    this.showData();
}

我想要完成的是我想创建一个 Context API 并将相同的状态、函数 ShowData 和 GetCoffee() 传递给多个不同的组件。

我该怎么做?

谢谢大家!

最佳答案

很简单,先创建一个新的上下文(context.js)

const Context = React.createContext();

使用上面创建的上下文(context.js)创建一个提供程序,该提供程序类将保存状态和方法。

class Provider extends React.Component {
  state = {
    some_state: 'value',
    some_method: this.method
  }

  method = () => {
    console.log('It works');
  }

  render() {
    return (
      <Context.Provider>
        {this.props.children}
      </Context.Provider>
    );
  }
}

导出提供者和消费者(context.js)

const Consumer = Context.Consumer;
export { Provider, Consumer };

使用提供程序 (app.js) 包装 App 组件,以便 App 树中的每个 JSX 组件都能够使用 some_statesome_method

import { Provider } from './{some_path}/context';

<Provider>
  <App> ... </App>
</Provider>

最后,使用某个组件中的值,您必须在声明 <Consumer> 后告诉您想要哪些状态属性组件(这里我们同时使用 some_statesome_method )

import { Consumer } from './{some_path}/context';

class SomeComponent extends React.Component {
  render() {
    return (
      <Consumer>
        {({some_state, some_method}) => {
          <button onClick={some_method}>{some_state}</button>
        }
      </Consumer>
    );
  }
}

关于javascript - 如何使用 Context API 将一个状态和函数传递给多个不同的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54483341/

相关文章:

javascript - 何时以及如何在 React JS 中使用分号(以及何时不使用)

javascript - 使用 IndexRoute 在我的 React 应用程序中设置登陆页面

javascript - 每次加载下一张图片之前,第一张图片都会变得可见

javascript - 尝试使用 React 向 google 进行身份验证时出现 firebase 错误

javascript - 使用局部变量(而不是重复的属性访问)是否会损害性能?

reactjs - 组件在异步 React 上下文更新时渲染两次

javascript - 我有很多弹出器,希望打开的那个在另一个打开时关闭

javascript - Spring中URL参数的加密和解密

javascript - 正则表达式 - 避免表达式中出现字符串

javascript - 在 ES6 React Javascript 中导入 ReactCSSTransitionGroup