首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在自己的单独文件中创建React上下文?

如何在自己的单独文件中创建React上下文?
EN

Stack Overflow用户
提问于 2020-06-13 21:53:26
回答 1查看 748关注 0票数 0

我正在学习React并使用上下文构建一个项目。最初,我在App.js组件中构建上下文,但为了使App.js更清晰,我希望将其分离到自己的文件中。然而,我很难弄清楚这是如何做到的,或者甚至是可能的。我认为我被卡住的部分是如何提供上下文。我在下面粘贴了新的上下文文件和App.js,其中注释掉了原始的上下文结构。有人知道我是怎么做到这一点的吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// TaskManipulatorContext
import React, { useReducer } from "react";
import AddTask from "../Components/dnd_components/AddTask";

export const TaskManipulatorContext = React.createContext();

const taskManipulatorInitialState = {
  panelData: {
    height: 50,
    open: false,
    title: "title",
    content: "content",
  },
  newTask: false,
  deleteTask: false,
  taskContainer: null,
};

const taskManipulatorReducer = (state, action) => {
  switch (action.type) {
    case "addTask-botPanel":
      // Brings up bottom panel to add new task
      return {
        ...state,
        panelData: {
          ...state.panelData,
          height: 20,
          open: true,
          title: "Add Task",
          content: <AddTask />,
        },
        taskContainer: {
          ...state.taskContainer,
          ...action.value,
        },
      };

    case "addTask-submitTask":
      // Submits task and adds it to list
      return {
        ...state,
        panelData: {
          ...state.panelData,
          closing: true,
        },
        newTask: true,
        taskContainer: {
          ...state.taskContainer,
          newTask: action.value,
        },
      };

    case "reset":
      // Reset back to initial state
      return taskManipulatorInitialState;
    default:
      return taskManipulatorInitialState;
  }
};

const [state, dispatch] = useReducer(
  taskManipulatorReducer,
  taskManipulatorInitialState
);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// App.js
import React, { useContext } from "react";
import "./index.css";
import RenderXMilageBoxes from "./Components/RenderXMilageBoxes";
import BottomPanel from "./Components/BottomPanel";
import AddTask from "./Components/dnd_components/AddTask";
import { TaskManipulatorContext } from "./Contexts/TaskManipulatorContext";

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * CONTEXTS  * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// export const TaskManipulatorContext = React.createContext();

// const taskManipulatorInitialState = {
//   panelData: {
//     height: 50,
//     open: false,
//     title: "title",
//     content: "content",
//   },
//   newTask: false,
//   deleteTask: false,
//   taskContainer: null,
// };

// const taskManipulatorReducer = (state, action) => {
//   switch (action.type) {
//     case "addTask-botPanel":
//       // Brings up bottom panel to add new task
//       return {
//         ...state,
//         panelData: {
//           ...state.panelData,
//           height: 20,
//           open: true,
//           title: "Add Task",
//           content: <AddTask />,
//         },
//         taskContainer: {
//           ...state.taskContainer,
//           ...action.value,
//         },
//       };

//     case "addTask-submitTask":
//       // Submits task and adds it to list
//       return {
//         ...state,
//         panelData: {
//           ...state.panelData,
//           closing: true,
//         },
//         newTask: true,
//         taskContainer: {
//           ...state.taskContainer,
//           newTask: action.value,
//         },
//       };

//     case "reset":
//       // Reset back to initial state
//       return taskManipulatorInitialState;
//     default:
//       return taskManipulatorInitialState;
//   }
// };

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * MAIN COMPONENT  * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function App() {
  // Contexts
  // const [state, dispatch] = useReducer(
  //   taskManipulatorReducer,
  //   taskManipulatorInitialState
  // );

  const taskManipulatorContext = useContext(TaskManipulatorContext);

  return (
    <div>
      <taskManipulatorContext.Provider
        value={{
          state,
          dispatch,
        }}
      >
        <RenderXMilageBoxes currentMiles={5001} numFutureServices={5} />
        <BottomPanel panelData={state.panelData} />
      </taskManipulatorContext.Provider>
    </div>
  );
}

export default App;
EN

回答 1

Stack Overflow用户

发布于 2020-06-13 22:27:17

我更喜欢这样做的方式是创建一个上下文,然后为提供者和useContext钩子提供相同的上下文,以便在组件中使用。

它看起来像这样:

TaskManiupulatorContext.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const TaskManipulatorContext = createContext({})

// dispatcher logic

export const TaskManipulatorContextProvider = () => {

    const [state, dispatch] = useReducer(
        taskManipulatorReducer,
        taskManipulatorInitialState
    );

    // You can choose to wrap this in a useMemo if you want to be extra careful about potential rerenders
    const taskManipulatorContextStore = {
        state,
        dispatch,
    }

    return <TaskManipulatorContext.Provider value={taskManipulatorContextStore}>{children}</TaskManipulatorContext.Provider>
}

export const useTaskManipulatorContext = () => useContext(TaskManipulatorContext)

然后,通过使用提供者包装您的应用程序,使上下文在应用程序级别可用:

App.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { TaskManipulatorContextProvider } from './TaskManipulatorContext'

// app logic

const App = () => {
  return (
    <TaskManipulatorContextProvider>
      <App />
    </TaskManipulatorContextProvider>
  )
}

现在,您可以从应用程序内的任何组件导入您的useTaskManipulatorContext挂钩并使用它:

SomeComponent.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useTaskManipulatorContext } from './TaskManipulatorContext'

export const SomeComponent = () => {

  const taskManipulatorCtx = useTaskManipulatorContext()

  const someFunctionWhichUpdatesContextState = (action) => {
    taskManipulatorCtx.dispatch(action)
  }

  return (
    <div>
      <text>{'Here is some state from the context'}</text>
      <text>{taskManipulatorCtx.state}</text>
    </div>
  )
}

请注意,采用这种方法可以在很大程度上控制上下文中的访问模式。例如,如果您不希望组件为了更改状态而直接访问分派,您可以在提供程序中创建一个方法来分派某些操作,并将其导出为您的函数可以使用的方法(即。您不需要依赖您的组件或使用您的组件的开发人员来了解如何更新状态的确切行为/实现)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const taskManipulatorContextStore = {
  state,
  addTask: (taskToAdd) = dispatch(actions.add, taskToAdd)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62365993

复制
相关文章
关于 SQLite 的 EXISTS 与 NOT EXISTS
需求:查询表一(Person)条件是表二(Person_Visison)里有没有表一(Person)的 id 如果有则不返回 结果集,没有则返回。
星哥玩云
2022/08/17
1K0
关于 SQLite 的 EXISTS 与 NOT EXISTS
webkit和blink在blob机制上不同的地方
WebKit.dll!WebCore::BlobURL::createBlobURL(const WTF::String & originString) 行 76 C++ WebKit.dll!WebCore::BlobURL::createPublicURL(WebCore::SecurityOrigin * securityOrigin) 行 47 C++ > WebKit.dll!WebCore::FileReaderLoader::start(WebCore::ScriptExecutionContext * scriptExecutionContext, WebCore::Blob * blob) 行 81 C++ WebKit.dll!WebCore::FileReader::readInternal(WebCore::Blob * blob, WebCore::FileReaderLoader::ReadType type, int & ec) 行 149 C++ WebKit.dll!WebCore::FileReader::readAsText(WebCore::Blob * blob, const WTF::String & encoding, int & ec) 行 113 C++ WebKit.dll!WebCore::jsFileReaderPrototypeFunctionReadAsText(JSC::ExecState * exec) 行 565 C++ > WebKit.dll!WebCore::BlobResourceHandle::BlobResourceHandle(WebCore::BlobData * blobData, const WebCore::ResourceRequest & request, WebCore::ResourceHandleClient * client, bool async) 行 173 C++ WebKit.dll!WebCore::BlobResourceHandle::createAsync(WebCore::BlobData * blobData, const WebCore::ResourceRequest & request, WebCore::ResourceHandleClient * client) 行 143 C++ WebKit.dll!WebCore::BlobRegistryImpl::createResourceHandle(const WebCore::ResourceRequest & request, WebCore::ResourceHandleClient * client) 行 80 C++ WebKit.dll!WebCore::createResourceHandle(const WebCore::ResourceRequest & request, WebCore::ResourceHandleClient * client) 行 59 C++ WebKit.dll!WebCore::ResourceHandle::create(WebCore::NetworkingContext * context, const WebCore::ResourceRequest & request, WebCore::ResourceHandleClient * client, bool defersLoading, bool shouldContentSniff) 行 92 C++ WebKit.dll!WebCore::ResourceLoader::start() 行 218 C++ WebKit.dll!WebCore::ResourceLoadScheduler::servePendingRequests(WebCore::ResourceLoadScheduler::HostInformation * host, WebCore::ResourceLoadPriority minimumPriority) 行 285 C++ WebKit.dll!WebCore::ResourceLoadScheduler::scheduleLoad(WebCore::ResourceLoader * resourceLoader) 行 189 C++ WebKit.dll!WebCore::ResourceLoadScheduler::scheduleSubresourceLoad(WebCore::Frame * frame, WebCore::CachedResource * resource, const WebCore::ResourceRe
龙泉寺扫地僧
2019/02/20
1.4K0
原exists, not exists用法
tableA |column1 | column1 |column3 | ---- tableb |column1 | column1 |column3 | ---- 要查询 tableA 的数据,条件是是 tableA.column1 不在 tableB 的 tableB.column2 中 也就是要得到类似以下语句的效果(not in 效果不完全等同于 not exists , 如果子查询中出现空记录, 则整个查询语句不会返回数据) SELECT a.* FROM tableA a
zcqshine
2018/05/11
1.2K0
直传文件到Azure Storage的Blob服务中
题记:为了庆祝获得微信公众号赞赏功能,忙里抽闲分享一下最近工作的一点心得:如何直接从浏览器中上传文件到Azure Storage的Blob服务中。 为什么 如果你的Web应用程序利用了云存储(比如Az
逸鹏
2018/04/10
2.3K0
直传文件到Azure Storage的Blob服务中
服务调用超时 AppService
服务通过 服务名 查找进程 正常启动 但是服务不能被连接。connect time out.
爱明依
2020/11/12
3670
exists
我们可以使用exists代替in查询: 阿里编码规约第五条第(三)条第9条: 【推荐】in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内。 我们可以在子元素多的情况下,使用exists查询 比如下面这个in查询 SELECT * FROM sys_user AS a WHERE id in ( SELECT user_id FROM sys_user_role AS b WHERE b.role_id IN ( SELECT id F
阿超
2022/08/21
4300
SQL笔记一(exists和not exists)
exists: (sql返回结果集,为真),说白了就是exists(条件),满足括号里面条件的结果就从里面返回结果 not exists:(sql不返回结果集,为真)而not exists(条件),满足括号里面条件的结果就排除掉
泽泽社长
2023/04/17
5120
Blob初探
简介   Blob在js中意味着二进制大数据。实现该接口的对象有3个属性,分别是type(MIME),size(byte)和 一个切割方法:slice(在大文件分片上传可能用到)。另外,File实现了Blob接口,并且还有额外的属性--name和 lastModify。   早起的一些浏览器实现了草案(已废弃)上的BlobBuilder,但是现在的大多浏览器废弃了该对象。目前,创建新的 Blob对象需要使用Blob构造函数,new Blob(array,type)。第一个参数数组中可以包含字符串,Array
欲休
2018/03/15
2.7K0
关于 Blob
对于 Blob,前端开发中可能比较少遇到;数据库中可使用 Blob 概念,例如 Mysql 存储二进制数据的类型就是 Blob,也就是说图片可存储于数据库中,以二进制格式存储
Krry
2020/05/17
2.7K0
SQL 子查询 EXISTS 和 NOT EXISTS[通俗易懂]
该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
全栈程序员站长
2022/11/17
4.7K0
如何在 Ubuntu 20.04 上设置 Nginx 服务器配置块
一个服务器配置块是一个 Nginx 指令,它定义了对于一个指定域名的设置,允许你在一个单机服务器上运行多个网站。对于每一个网站,你可以设置网站文件根目录(包含网站文件的目录),创建一个独立的安全策略,使用不同的 SSL 证书等等。
雪梦科技
2020/07/14
7K0
如何在 Ubuntu 20.04 上设置 Nginx 服务器配置块
真正理解exists 和not exists
​ 下面也写了sql解答,使用了group_concat()函数,这个函数是分组后将一组的字段(比如name)拼接在一起,默认以逗号分隔。这个思路可以,但是在成绩表插入信息时的顺序是乱的,那又怎么查。
全栈程序员站长
2022/09/18
2.7K0
真正理解exists 和not exists
mysql中not exists用法_not exists用法
not exists是sql中的一个语法,常用在子查询和主查询之间,用于条件判断,根据一个条件返回一个布尔值,从而来确定下一步操作如何进行,not exists也是exists或in的对立面。
全栈程序员站长
2022/09/13
8.9K0
mysql中not exists用法_not exists用法
微服务超时与重试
经常被提起的两种超时:connection timeout、socket timeout
码农戏码
2021/03/23
1.5K0
如何在 CentOS 8 上设置 Nginx 服务器配置块
一个服务器配置块是一个 Nginx 指令,它定义了对于一个指定域名的设置,允许你在一个单机服务器上运行多个网站。对于每一个网站,你可以设置网站文件根目录(包含网站文件的目录),创建一个独立的安全策略,使用不同的 SSL 证书等等。
雪梦科技
2020/05/11
2.3K0
如何在 CentOS 8 上设置 Nginx 服务器配置块
Zuul超时问题,微服务响应超时,zuul进行熔断
是这样的,今天碰到了微服务响应超时问题,而且超时时间特别短,2秒就超时,zuul就走熔断了。 我采用zuul作为网关,根据不同的访问路径进行微服务的路由,譬如有个服务是user,我访问user服务的某个接口时,该接口执行时间很慢,2秒多,然后还没执行完,zuul就执行熔断了,进入了我配好的ZuulFallbackProvider里。所以来研究一下zuul的超时处理。 前提,zuul和微服务都已经注册到了eureka中,zuul采用service-id来进行路由,当访问/user时进入到user服务中。而且,已经为user服务设置好了zuul的熔断,譬如已经写好了UserFallbackProvider implements ZuulFallbackProvider。我特别设置了模拟超时的接口,就是搞几个接口sleep不同的时间。
天涯泪小武
2019/01/17
3.1K0
in 和 exists 的不同
in 是把外表和内表做 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询,一直以来认为 exists 比 in 的效率高的说法是不准确的。如果两个表大小相当,则 in 和 exists 的效率是差不多的,如果两个表的一大一小,则子查询表大的用 exists,子查询表小的用 in。
zucchiniy
2019/10/30
8130
Blob
如果你允许用户从你的网站上下载某些文件,那你可能会遇到 Blob 类型。为了实现上述的功能,你可以很容易从网上找到相关的示例,并根据实际需求进行适当的调整。对于部分开发者来说,在完成上述功能之后,他们并不会继续思考 Blob 是什么?
小蔚
2020/06/12
6.2K0
Blob
开启mac上印象笔记的代码块
Mac 印象笔记左上角菜单栏:偏好设置-->软件更新-->开启代码块 (Preferences -> Software Update -> Enable code block) 如图:
程序员十三
2018/06/07
8330
SQL 中的in与not in、exists与not exists的区别以及性能分析
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。
Java技术精选
2021/08/24
2.1K0

相似问题

IF EXISTS块

32

blob服务python中的附加块

218

DigitalOcean NGINX服务器块上的请求超时

256

CloudBlobContainer .Exists()将挂起/超时

15

如何在服务块中停止超时

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文