标签: react-context

Nextjs 和上下文 API

使用 Next.js,我试图在 Context API 状态中获取数据后将它们保存在 中getInitialProps,以修复道具钻孔。

但由于getInitialProps是静态方法,我们无法通过 this.context 访问它。我设法将它们保存在 componentDidMount 中,但在这种情况下,上下文状态在第一页加载时为空,直到填充为止。不确定在这种情况下的最佳做法是什么。我应该在哪个生命周期中将初始数据保存到 Context 以便像 props 传递一样立即获得它们?

reactjs next.js react-context context-api

17
推荐指数
1
解决办法
2万
查看次数

React Context API 不适用于自定义 NPM 组件库

我已经构建了一个 ReactJS 组件库,用于使用 sim 链接通过 NPM 包安装的多个项目。我想使用上下文 API 将数据从组件库提供的父组件传递到我的基础项目,以便由组件库提供的多个使用者组件使用。当我尝试时,我的子组件中的上下文始终未定义。

如果我将我的消费者组件放在我的库中的提供者组件中,它就像一个冠军,但这会破坏我想要实现的目标。如果我将提供者和消费者都导出到我的基础项目,消费者将看不到提供者。

这是来自我的基础项目

import { Screen, COD, GenericSocketServer } from 'component-library'

export default class View extends React.PureComponent {
  render() {
    return (
      <Screen className="screen odmb1">
        <GenericSocketServer>
          <COD />
        </GenericSocketServer>
      </Screen>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

这是从我的“组件库”导出的提供程序代码

import React from 'react';
import MyContext from "./context";
import COD from './../cod';

export default class GenericSocketServer extends React.Component {
  render() {
    return (
      <MyContext.Provider value={{ foo: 'bar' }}>
        <COD />
        {this.props.children}
      </MyContext.Provider>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我在“组件库”中使用的内容代码

import React …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-context

17
推荐指数
2
解决办法
1783
查看次数

如何从渲染之外的React Context Consumer获取数据

我正在使用新的React Context API,我需要从Context.Consumer变量中获取Consumer数据,而不是在render方法中使用它.无论如何我能做到这一点吗?

例如,我想要的是:

console.log(Context.Consumer.value);
Run Code Online (Sandbox Code Playgroud)

到目前为止我测试的内容:上面的例子,测试了Context.Consumer currentValue和Context Consumer所拥有的其他变量,试图将Context.Consumer()作为一个函数执行而没有工作.

有任何想法吗?

reactjs react-context

16
推荐指数
2
解决办法
1万
查看次数

在 ReactNative 中使用多个上下文提供程序的更好方法

我有一个应用程序,我在其中使用 3 Context Provider。要使应用程序正常工作,我必须将 <App/>所有这些providers. 随着我的应用程序的增长,我希望有更多的提供程序来处理我必须连接的更多类型的数据。我已经开始觉得可能有更好的方法将提供者传递到<App />.

我的App.js代码:

import React from 'react';
import { createStackNavigator } from 'react-navigation-stack';
import { createAppContainer } from 'react-navigation';
import { Provider as BlogProvider} from './src/context/BlogContext';
import { Provider as VehicleProvider} from './src/context/VehicleContext';
import { Provider as AuthProvider} from './src/context/AuthContext';

import IndexScreen from './src/screens/IndexScreen';
import ShowScreen from './src/screens/ShowScreen';
import CreateScreen from './src/screens/CreateScreen';
import EditScreen from './src/screens/EditScreen';
import VehicleScreen from './src/screens/VehicleScreen';

const navigator = createStackNavigator(
  {
    Index: IndexScreen, …
Run Code Online (Sandbox Code Playgroud)

reactjs react-native react-context react-hooks use-context

15
推荐指数
1
解决办法
3202
查看次数

如何获取数据并存储在 React Context API 中?

第一次使用 Context API,请耐心等待。

我有一个本地 JSON 文件,我试图从中获取响应并将响应放入 Context API 中,以便我可以在应用程序中全局使用。

在本地运行应用程序时,出现空白屏幕,并且页面似乎无法加载。该页面处于无限循环中,因此我看不到它是否正在加载。

代码沙箱在这里

知道我可以更改什么才能将数据响应成功引入 Context API?

apiContext.js:

import React, { useContext, useState, useEffect, createContext } from "react";
import axios from "axios";

const APIContext = createContext();

function APIContextProvider({ children }) {
  // Initialize state
  const [data, setData] = useState([]);
  const [isLoading, setIsLoading] = useState(true);

  // Fetch data
  useEffect(() => {
    let url = "../db.json";
    axios
      .get(url)
      .then(function (response) {
        setData(response.data.machines);
        setIsLoading(false);
        console.log(response.data.machines);
      })
      .catch((error) => console.log(error));
  }, []);

  return (
    <APIContextProvider …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs axios react-context

15
推荐指数
1
解决办法
2万
查看次数

新的React Context API是否会触发重新渲染?

我一直在尝试理解新的React Context API并且正在玩它.我只是想检查一个简单的案例 - 当更新数据到提供者时,所有重新呈现的内容.

在Codesandbox上查看这个小例子

所以,在我的例子中,我有一个App组件 - 具有类似这样的状态 -

this.state = {
  number - A random number
  text - A static text
} 
Run Code Online (Sandbox Code Playgroud)

我从这里创建一个新的React Context包含numbertext来自state并将值传递给两个使用者NumberText.

所以我的假设是如果随机数更新,它将改变上下文,并且两个组件都应该触发重新渲染.

但实际上,价值正在更新,但没有重新发生.

所以,我的问题 -

  1. 对上下文的更新是否不会通过因使用的rerenders传播?因为当上下文改变时我看不到我的日志/颜色变化.

  2. 是否更新了该提供商的所有消费者?

javascript reactjs react-context

14
推荐指数
2
解决办法
1万
查看次数

新的上下文api应该如何与React Native导航器一起使用?

我按照这个例子使用React Navigator创建了一个多屏幕应用程序:

import {
  createStackNavigator,
} from 'react-navigation';

const App = createStackNavigator({
  Home: { screen: HomeScreen },
  Profile: { screen: ProfileScreen },
});

export default App;
Run Code Online (Sandbox Code Playgroud)

现在我想使用新的内置上下文api添加一个全局配置状态,因此我可以使用一些可以在多个屏幕上操作和显示的公共数据.

问题是上下文显然需要具有共同父组件的组件,以便上下文可以向下传递给子组件.

我如何使用不知道共享父母的屏幕来实现这一点,因为它们是由react navigator管理的?

reactjs react-native react-navigation react-context

14
推荐指数
1
解决办法
4883
查看次数

使用钩子响应上下文可防止重新渲染

我使用带有钩子的 React 上下文作为我的 React 应用程序的状态管理器。每次 store 中的值发生变化时,所有组件都会重新渲染。

有没有办法阻止 React 组件重新渲染?

店铺配置:

import React, { useReducer } from "react";
import rootReducer from "./reducers/rootReducer";

export const ApiContext = React.createContext();

export const Provider = ({ children }) => {
  const [state, dispatch] = useReducer(rootReducer, {});

  return (
    <ApiContext.Provider value={{ ...state, dispatch }}>
      {children}
    </ApiContext.Provider>
  );
};
Run Code Online (Sandbox Code Playgroud)

减速器的一个例子:

import * as types from "./../actionTypes";

const initialState = {
  fetchedBooks: null
};

const bookReducer = (state = initialState, action) => {
  switch (action.type) {
    case …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-native react-context

14
推荐指数
2
解决办法
1万
查看次数

React Context api - 上下文更改后消费者不会重新渲染

我搜索了一个答案但找不到任何答案,所以我在这里问,我有一个更新上下文的消费者,另一个应该显示上下文的消费者。我正在使用与打字稿(16.3)的反应

上下文(AppContext.tsx):

export interface AppContext {
    jsonTransactions: WithdrawTransactionsElement | null;
    setJsonTran(jsonTransactions: WithdrawTransactionsElement | null): void;
}

export const appContextInitialState : AppContext = {
    jsonTransactions: null,
    setJsonTran : (data: WithdrawTransactionsElement) => {
        return appContextInitialState.jsonTransactions = data;
    }
};

export const AppContext = React.createContext(appContextInitialState);
Run Code Online (Sandbox Code Playgroud)

生产者(App.tsx):

interface Props {}

class App extends React.Component<Props, AppContext> {

  state: AppContext = appContextInitialState;

  constructor(props : Props) {
    super(props);
  }

  render() {
    return (
        <AppContext.Provider value={this.state}>
          <div className="App">
            <header className="App-header">
              <SubmitTransactionFile/>
              <WithdrawTransactionsTable />
            </header>
          </div>
        </AppContext.Provider>
    );
  } …
Run Code Online (Sandbox Code Playgroud)

javascript typescript reactjs react-context

13
推荐指数
1
解决办法
2万
查看次数

如何使 Snackbar 成为 withContext 的全局组件

我正在尝试使用一个小吃栏组件,该组件采用 open 和 message 属性,并且可以从应用程序的任何页面显示(将 open 设置为 true)。

据我了解,我应该使用 Context。但我不太确定从哪里开始。

这就是我到目前为止所拥有的

我希望将小吃栏放在最高的父组件上

import { createContext } from 'react';

export const SnackbarContext = createContext({});
Run Code Online (Sandbox Code Playgroud)
 const [snack, setSnack] = useState({
    message: '',
    color: '',
    open: false,
  });
Run Code Online (Sandbox Code Playgroud)
<SnackbarContext.Provider value={{ snack, setSnack }}>
  <Snackbar open={snack.open}>
    <Alert>
      {snack.message}
    </Alert>
  </Snackbar>
  <ViewContainer>
    <Switch>{switchRoutes}</Switch>
  </ViewContainer>
</SnackbarContext.Provider>
Run Code Online (Sandbox Code Playgroud)

并能够从任何子组件调用它

import { SnackbarContext } from 'SnackbarContext';

const { snack, setSnack } = useContext(SnackbarContext);

Run Code Online (Sandbox Code Playgroud)

然后像这样将道具更改为snackbar

setSnack({ message: 'hello', open: true})
Run Code Online (Sandbox Code Playgroud)

reactjs material-ui react-context

13
推荐指数
1
解决办法
7797
查看次数