摘要:翻譯瘋狂的技術宅原文本文首發微信公眾號歡迎關注,每天都給你推送新鮮的前端技術文章現在已經成為一個實驗性功能,但是只有在中才能用在生產中。創建完成后,我們可以導入并用它來創建我們的,我們稱之為。在巨大的宣傳攻勢下將會使變得過時。
翻譯:瘋狂的技術宅
原文:https://www.toptal.com/react/...
本文首發微信公眾號:jingchengyideng
歡迎關注,每天都給你推送新鮮的前端技術文章
React Context API 現在已經成為一個實驗性功能,但是只有在 React 16.3.0 中才能用在生產中。本文將向你展示兩個基本的 Web 商店應用程序,一個使用了 Context API 進行構建,另一個則不用。
這個新的API解決了一個嚴重的問題 ——prop drilling。 即使你不熟悉這個術語,如果你曾經用 React.js 做過開發,它可能就已經在你身上發生過了。 Prop drilling 是通過將數據傳遞到多個中間 React 組件層,將數據從組件A 獲取到組件 Z 的過程。 組件將間接的接收props,而你必須確保一切正常。
我們先探討如何在沒有 React Context API 的情況下處理常見問題:
App.js
class App extends Component { state = { cars: { car001: { name: "Honda", price: 100 }, car002: { name: "BMW", price: 150 }, car003: { name: "Mercedes", price: 200 } } }; incrementCarPrice = this.incrementCarPrice.bind(this); decrementCarPrice = this.decrementCarPrice.bind(this); incrementCarPrice(selectedID) { // a simple method that manipulates the state const cars = Object.assign({}, this.state.cars); cars[selectedID].price = cars[selectedID].price + 1; this.setState({ cars }); } decrementCarPrice(selectedID) { // a simple method that manipulates the state const cars = Object.assign({}, this.state.cars); cars[selectedID].price = cars[selectedID].price - 1; this.setState({ cars }); } render() { return (); } }{/* Pass props twice */} Welcome to my web store
ProductList .js
const ProductList = props => (); export default ProductList;Product list:
{/* Pass props twice */}{/* Other potential product categories which we will skip for this demo: */} {/* */} {/* */} {/* */}
Cars.js
const Cars = props => (); Cars:
{/* Finally we can use data */} {Object.keys(props.cars).map(carID => (props.incrementCarPrice(carID)} decrementPrice={() => props.decrementCarPrice(carID)} /> ))}
Car.js
const Cars = props => (); Name: {props.name}
Price: ${props.price}
當然,這不是處理數據的最好方式,但我希望能夠用它說明為什么 prop drilling 很差勁。 那么 Context API 是如何幫我們避免這種情況呢?
介紹Context Web Store讓我們重構程序并演示它可以做些什么。 簡而言之,Context API 允許你擁有一個存儲數據的中央存儲(是的,就像存儲在 Redux 中一樣)。你可以把任何組件直接插入到商店應用中,也可以切斷 middleman!
重構非常簡單 —— 我們不必對組件的結構進行任何修改。但是我們確實需要創建一些新組件:Provider 和 consumer。
1.初始化 Context首先,我們需要創建context,后面可以使用它來創建 Provider 和 consumer。
MyContext.js
import React from "react"; // this is the equivalent to the createStore method of Redux // https://redux.js.org/api/createstore const MyContext = React.createContext(); export default MyContext;2. 創建 Provider
完成后,我們可以導入 context 并用它來創建我們的 provider,我們稱之為 MyProvider。在里面使用一些值初始化一個狀態,你可以通過 value prop 共享我們的 provider 組件。 在例子中,我們將共享 this.state.cars 以及一些操縱狀態的方法。 將這些方法可以看作是 Redux 中的 Reducer。
MyProvider.js
import MyContext from "./MyContext"; class MyProvider extends Component { state = { cars: { car001: { name: "Honda", price: 100 }, car002: { name: "BMW", price: 150 }, car003: { name: "Mercedes", price: 200 } } }; render() { return ({ const cars = Object.assign({}, this.state.cars); cars[selectedID].price = cars[selectedID].price + 1; this.setState({ cars }); }, decrementPrice: selectedID => { const cars = Object.assign({}, this.state.cars); cars[selectedID].price = cars[selectedID].price - 1; this.setState({ cars }); } }} > {this.props.children} ); } }
為了使 provider 可以訪問其他組件,我們需要用它包裝我們的應用程序(沒錯,就像 Redux 一樣)。我們可以擺脫這些狀態和方法,因為它們在 MyProvider.js 中定義。
App.js
class App extends Component { render() { return (3. 創建 Consumer); } } Welcome to my web store
我們需要再次導入 context 并用它包裝我們的組件,它會在組件中注入context 參數。 之后,它非常直接。 你使用 context 就像用 props 一樣。 它包含我們在 MyProducer 中共享的所有值,我們所需要做的只是去使用它!
Cars.js
const Cars = () => ({context => ( );)} Cars:
{Object.keys(context.cars).map(carID => (context.incrementPrice(carID)} decrementPrice={() => context.decrementPrice(carID)} /> ))}
我們似乎忘記了什么?是 ProductList !它使好處變得非常明顯。 我們不必傳遞任何數據或方法。這個組件被簡化,因為它只需要去渲染一些組件。
ProductList.js
const ProductList = () => ();Product list:
{/* Other potential product categories which we will skip for this demo: */} {/* */} {/* */} {/* */}
在本文中,我對 Redux 和 Context API 進行了一些比較。 Redux 最大的優勢之一就是你的應用可以擁有一個可以從任何組件訪問的中央存儲。而使用新的 Context API,默認情況下你已經有了這個功能。 在巨大的宣傳攻勢下 Context API 將會使 Redux 變得過時。
對于那些只把 Redux 作為中央存儲功能的人來說,可能確實如此。 如果你只使用 Redux 的這一個功能,現在可以使用 Context API 替換它,并避免在不使用第三方庫的情況下進行 prop drilling。
本文首發微信公眾號:jingchengyideng
歡迎關注,每天都給你推送新鮮的前端技術文章
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101893.html
摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅持每天花分鐘來學習與思考。 今天的React題沒有太多的故事…… 半個月前出了248個Vue的知識點,受到很多朋友的關注,都強烈要求再出多些React相前的面試題,受到大家的邀請,我又找了20多個React的使用者,他們給出了328道React的面試題,由我整理好發給大家,同時發布在了前端面試每日3+1的React專題,希望對大家有所幫助,同時大...
摘要:怎樣使用假設有個如下的結構上面的例子中,我們把手動的方式傳給了,這期間穿越了,而對本身沒有什么用。不建議使用絕大多數的應用程序是不需要使用的。如果項目對數據管理較為復雜,推薦使用類似于或這樣的狀態管理庫,而不要使用。 What is Context 今天在學習styled-components的Theming時,關于styled-components對主題的實現與管理上提到,主要應用到...
摘要:但是,有一件事是肯定的年對全棧開發者的需求量很大。有一些方法可以解決這個問題,例如模式,或者你可以這么想,其實谷歌機器人在抓取單頁應用程序時沒有那么糟糕。谷歌正在這方面努力推進,但不要指望在年會看到任何突破。 對于什么是全棧開發者并沒有一個明確的定義。但是,有一件事是肯定的:2019 年對全棧開發者的需求量很大。在本文中,我將向你概述一些趨勢,你可以嘗試根據這些趨勢來確定你可能要投入的...
摘要:但是,有一件事是肯定的年對全棧開發者的需求量很大。有一些方法可以解決這個問題,例如模式,或者你可以這么想,其實谷歌機器人在抓取單頁應用程序時沒有那么糟糕。谷歌正在這方面努力推進,但不要指望在年會看到任何突破。 對于什么是全棧開發者并沒有一個明確的定義。但是,有一件事是肯定的:2019 年對全棧開發者的需求量很大。在本文中,我將向你概述一些趨勢,你可以嘗試根據這些趨勢來確定你可能要投入的...
摘要:但是,有一件事是肯定的年對全棧開發者的需求量很大。有一些方法可以解決這個問題,例如模式,或者你可以這么想,其實谷歌機器人在抓取單頁應用程序時沒有那么糟糕。谷歌正在這方面努力推進,但不要指望在年會看到任何突破。 對于什么是全棧開發者并沒有一個明確的定義。但是,有一件事是肯定的:2019 年對全棧開發者的需求量很大。在本文中,我將向你概述一些趨勢,你可以嘗試根據這些趨勢來確定你可能要投入的...
閱讀 1391·2019-08-30 12:54
閱讀 1877·2019-08-30 11:16
閱讀 1621·2019-08-30 10:50
閱讀 2454·2019-08-29 16:17
閱讀 1273·2019-08-26 12:17
閱讀 1385·2019-08-26 10:15
閱讀 2393·2019-08-23 18:38
閱讀 791·2019-08-23 17:50