当前位置: 首页 > 编程笔记 >

React.js中的上下文API

乐正德华
2023-03-14
本文向大家介绍React.js中的上下文API,包括了React.js中的上下文API的使用技巧和注意事项,需要的朋友参考一下

React上下文api在版本16.3或最新版本中可以安全地用于生产中。添加上下文api的原因是,如果有一系列子组件,则避免传递prop。

在不使用上下文api的情况下,我们必须将道具传递给所有中间组件。另一种替代解决方案是使用第三方库(例如Redux)来维护中央存储

了解道具传递问题

App.js→书籍道具→BookList.js→再次将书籍作为道具→Book.js

随着子组件数量的增加,传递道具的链条继续进行。

使用上下文api,React提供了一种提供方使用者方法来解决此问题。

Creating the context:
BaseContext.js
import React from 'react';
//这与Redux的createStore方法相同
const BaseContext = React.createContext();
export default BaseContext;

创建提供者

import BaseContext from './BaseContext';
class BookProvider extends Component {
   state = {
      books: {
         book1: { name: 'React', price: 500 },
         book2: { name: 'Angular', price: 450 }
      }
   };
   render() {
      return (
         <BaseContext.Provider
            value={{
               books: this.state.books,
               incrementPrice: selectedID => {
                  const books = Object.assign({}, this.state.books);
                  books[selectedID].price =books[selectedID].price + 1;
                  this.setState({
                     books
                  });
               },
               decrementPrice: selectedID => {
                  const books = Object.assign({}, this.state.books);
                  books[selectedID].price =books[selectedID].price - 1;
                  this.setState({
                     books
                  });
               }
            }}
         >
         {this.props.children}
         </BaseContext.Provider>
      );
   }
}

App.js

class App extends Component {
   render() {
      return (
         <BookProvider>
            <div className="App">
               <header className="App-header">
                  <h1 className="App-title">Welcome to my book store</h1>
               </header>
               <ProductBookList />
            </div>
         </BookProvider>
      );
   }
}

在子组件中,我们可以使用使用者-

const Books = () => (
   <BaseContext.Consumer>
      {context => (
         <Fragment>
            <h4>Books:</h4>
            {Object.keys(context.books).map(bookID => (
               <Car
                  key={bookID}
                  name={context.books[bookID].name}
                  price={context.books[bookID].price}
                  incrementPrice={() =>context.incrementPrice(bookID)}
                  decrementPrice={() =>context.decrementPrice(bookID)}
               />
            ))}
         </Fragment>
      )}
   </BaseContext.Consumer>
);

通过使用context api,我们可以避免在React子组件中钻取道具。

 类似资料:
  • 摘自http://developer.android.com/guide/topics/ui/settings.html:

  • 通过 Context 可以获取到 *Request 和 ResopnseWriter 。同时还有一些方便的函数可以进行操作。 Req() 获取到*Request对象。 Forms() 可以获取表单提交内容,具体参见 Forms Cookies() 获取到Cookies对象并进行操作。 SecureCookies() 获取到安全Cookie对象并进行操作。 ServeFile() 将文件发送给浏览器

  • 问题内容: 我希望用户上传一个.csv文件,然后让浏览器能够解析该文件中的数据。我正在使用ReactJS。这将如何运作?谢谢。 问题答案: 弄清楚了。的组合反应文件阅读器和HTML5的的FileReader(见本页)。 将react-file-reader位放在render内部: 然后在上面。

  • 我正在学习核心java,并学习了多线程。 我已经阅读了标准文档和这个问题,所以。。。但是在线程上下文中找不到合适的解决方案。 用书中的话说: 在两次启动线程时引发。 我不明白它说什么...甚至没有给出例子... 当它发生在线程上下文中时?有人能举个例子吗?

  • 问题内容: 我是django初学者,所以我试图理解上下文和上下文处理器的概念。 什么是上下文,为什么要使用它? 你是否需要上下文才能在模板中使用它? 上下文和上下文处理器是否相同? 非常感谢你的回复。提前致谢! 问题答案: 当你使用Django模板时,它会被编译一次(并且只能编译一次)并存储以供将来使用,作为优化。模板可以在双花括号中包含变量名,例如 和。 一个背景是变量名称为字典键和它们的值的值

  • 问题内容: 我有一个Spring bean(dao)对象,该对象通过以下xml在ServletContext中实例化: 该bean在我的webapp-servlet.xml文件中声明,并由我的应用程序在ServletContext中使用。 我也在使用SpringSecurity。据我了解,这在不同的上下文(SecurityContext)中运行。 我的应用程序具有webapp-security.x