最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談React Native 傳參的幾種方式(小結(jié))

 更新時間:2019年05月21日 14:16:27   作者:跨越銀河Galaxy  
這篇文章主要介紹了淺談React Native 傳參的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在React Native 中由于業(yè)務(wù)的需要, 我們往往要在諸多的頁面間,組件之間做一些參數(shù)的傳遞與管理, 在這里我總結(jié)了幾大經(jīng)過驗證,穩(wěn)定好用的方式給大家

React Navigation 導(dǎo)航傳值

推薦指數(shù): ♥ ♥ ♥ ♥ ♥

適用范圍: 相互跳轉(zhuǎn)的頁面間傳值

兼容性: IOS/Android

原理: React Navigation 為頁面的 props 上掛載了 navigation 對象, 可用來做路由跳轉(zhuǎn),在做頁面跳轉(zhuǎn)時可以攜帶參數(shù)/回調(diào)方法前往目標(biāo)頁面, 從而達到傳參的目的

說明: 這是官方推薦,也是我們在業(yè)務(wù)開發(fā)中用得最多,最為推崇的一種傳參方式, 思想與 web 在 querystring 上帶參跳轉(zhuǎn)類似,只是實現(xiàn)方式略微不同, 舉例

導(dǎo)航傳值即可正向傳值,也可反向傳值 例如 A->B 是正向傳值, 而B->A 則是反向傳值

正向傳值:

A頁面跳轉(zhuǎn)向B頁面, 在組件內(nèi)通過訪問 this.props.navigation.navigate('B', { 

 type: 'list',   
 callback:data => { console.log('data in callback: ', data); }
 });

在B頁面 就能在組件的生命周期函數(shù)中拿到值

 componentWillMount() {
 const { state: { params: { type, callback }, goBack }} = this.props.navigation;
 console.log('type: ', type);
 // type 'list'
 }

反向傳值: 在反回上一個頁面時, 手動調(diào)用callback, 并給其傳參, 再調(diào)用 goBack 方法, 即可達到目的

還是上面的例子:

當(dāng)從B返回A的時候

 goBackToPageA: () => {
 const { state: { params: { type, callback }, goBack }} = this.props.navigation;
 callback({ id: '123', message: type + ' really?'});
 goBack();
 }
 goBackToPageA();

 回到A頁面后

'data in callback: ', { id: '123', message: 'list really?'});

 也即callBack 中的 data 參數(shù)就是 { id: '123', message: 'list really?'}

DeviceEventEmitter 觸發(fā)事件并傳值

推薦指數(shù): ♥ ♥ ♥ ♥

適用范圍: 頁面間傳值/組件間傳值

兼容性: IOS/Android

原理: 利用 React Native 包中提供的 DeviceEventEmitter 模塊訂閱事件,觸發(fā)事件,并能同時傳值

說明: DeviceEventEmitter 從名字就能知道他是基于事件訂閱的機制來進行傳值的, 當(dāng)訂閱某種事件后, 觸發(fā)的時候會調(diào)用訂閱事件的回調(diào), 并能把值傳送過去, 并且在同頁面內(nèi)的組間件, 不同頁面間都可以傳值, 但前提是頁面還未被銷毀(銷毀后事件的訂閱會取消), 例如:

 DeviceEventEmitter.addListener('warning_event', (data) => { console.log('data: ', data);})
 DeviceEventEmitter.emit('warning_event', { name: 'Mega Galaxy'});
 // data: { name: 'Mega Galaxy' }

在emit(觸發(fā))事件后, 回調(diào)函數(shù)的入?yún)⒕妥兂闪宋覀兯鶄鬟f的 { name: 'Mega Galaxy'}, 

也可不傳值,不傳值時 callback 的入?yún)⒕褪?undefined

缺點: 本質(zhì)是對自定義事件的監(jiān)聽與觸發(fā), 當(dāng)頁面邏輯復(fù)雜時,代碼會相對變大, 維護成本變高, 且監(jiān)聽過多會造成性能問題, 還有一點就是在頁面銷毀時必須移除監(jiān)聽: 如果忘記移除監(jiān)聽會怎么樣? 那emit 一次的時候, 會多響應(yīng)一次你加上去的監(jiān)聽

componentDidMount() {
 this.eventHandler = DeviceEventEmitter.addListner('event_name', callback);
}
componentWillUnmount() {
 this.eventHandler.remove();
}

個人建議: 在梳理清楚頁面邏輯后,合理使用

AsyncStorage Key-Value 式的存儲傳參

推薦指數(shù): ♥ ♥ ♥ ♥

適用范圍: 跨頁面 跨組件的任性傳參

兼容性: IOS/Android

原理: 利用類似 web 中 localStorage 的思想,將參數(shù)/數(shù)據(jù)存放在 AsyncStorage中,在需要的地方再取出來

說明: localStorage 在 web 中的實用性 與 受歡迎程度大家是知道的, AsyncStorage其實就是 rn 版的 localStorage, 略微不同的是它是異步的,只返回 Promise, 所以與 async/await 結(jié)合會非常好用

···

在A頁面

saveOrderData = async () => {
 try {
 const orderData = [{ id: 1, data: []}, { id: 2, data: []}]
 await AsyncStorage.setItem('Order_data_cache', JSON.stringify(orderData ));
 } catch (error) {
 // Error saving data
 }
}

在B頁面

loadOrderData = async () => {
 const __orderData = await AsyncStorage.getItem('Order_data_cache');
 const orderData = JSON.parse(__orderData);
 this.setState({ orderData });
}

缺點: 以 Key-Value 式的存儲傳參,可能重點還是在數(shù)據(jù)存儲上, 且因為涉及到 I/O 的操作,在部份低端機型上,有卡頓的可能性

React Context Api 傳參(新版Context Api)

推薦指數(shù): ♥ ♥ ♥

適用范圍: 不同頁面間的組件共享公共類的數(shù)據(jù)

兼容性: IOS/Android

原理: 利用生成的數(shù)據(jù)倉庫包裹父級組件, 再從子組件中獲取數(shù)據(jù)倉庫中的數(shù)據(jù)

說明: Context Api 在管理登錄用戶數(shù)據(jù)這類具有公共屬性的數(shù)據(jù)是一把利器, 但使用起來會相當(dāng)繁瑣

 const ContextWrapper = React.createContext();
 <ContextWrapper.Provider value={{ name: 'Mega Galaxy', job: 'FrontEnd Engineer' }}
 <App />
 <ContextWrapper.Provider>
 // 注意這里的 <App /> 是指我們 App的根組件,在包裹根組件后 我們可以在任意子頁面組件 中取值

任意 <App /> 里的子頁面組件中

 <ContextWrapper.Counsumer> 
 { context => <Text> { context.name } { context.job }</Text> }
 </ContextWrapper.Counsumer>
 會渲染成 <Text> Mega Galaxy FrontEnd Engineer </Text>

缺點: 理解需要花一些功夫, 寫法繁瑣,且只適合特定類型的數(shù)據(jù),要明確組件間的包裹關(guān)系

Global 傳值

推薦指數(shù): ♥ ♥ ♥

適用范圍: 頁面間傳值

兼容性: IOS/Android

原理: 利用 Node.js 中的頂級對象 Global 來掛載屬性, 利用屬性傳值

說明: 在跳轉(zhuǎn)的頁面前,可以把需要傳遞的參數(shù)掛載在 Global 對象上, 在跳轉(zhuǎn)后即可在 Global 對象上取過相同的鍵取到對應(yīng)的值, 例如: 在 A 頁面跳轉(zhuǎn) B 頁面時, Global.params = { name: 'Jalon', id: '123456'}, 在跳轉(zhuǎn)之后, 即可通過 Global.params 拿到值, 除了普通的字值串,布爾值,對象,數(shù)組, 也可以傳遞函數(shù), 但要注意帶有 this.setState 方法的函數(shù)傳遞后 調(diào)用可能會報錯.

缺點: 如果掛載的屬性/方法過多 易造成沖突與污染, 不利于維護

個人建議: 在 react-navigation 跳轉(zhuǎn)傳值 與 DeviceEventEmitter 維護不方便的情況下才使用, 但盡量少用, 以免造成 Global 屬性的污染與沖突

總結(jié)了5種常見的參數(shù)/數(shù)據(jù)傳遞的方法,以個人角度來看, 推薦順序為 React Navigation 導(dǎo)航傳值 > DeviceEventEmitter 觸發(fā)事件并傳值 > AsyncStorage Key-Value 式的存儲傳參, 最后 兩種是在特殊場景下才會去使用,所以朋友們,在合適的場景選擇合適的方式去傳值,會為React Native項目的開發(fā)帶來更為理想的效果,感謝您的閱讀,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決React報錯React.Children.only expected to receive single React element child

    解決React報錯React.Children.only expected to rece

    這篇文章主要為大家介紹了React報錯React.Children.only expected to receive single React element child分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • react源碼合成事件深入解析

    react源碼合成事件深入解析

    這篇文章主要為大家介紹了react源碼合成事件深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • react底層的四大核心內(nèi)容架構(gòu)詳解

    react底層的四大核心內(nèi)容架構(gòu)詳解

    這篇文章主要為大家詳細介紹了react四大核心內(nèi)容架構(gòu),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • React?Redux管理庫示例詳解

    React?Redux管理庫示例詳解

    這篇文章主要介紹了如何在React中直接使用Redux,目前redux在react中使用是最多的,所以我們需要將之前編寫的redux代碼,融入到react當(dāng)中去,本文給大家詳細講解,需要的朋友可以參考下
    2022-12-12
  • ReactJS?應(yīng)用兼容ios9對標(biāo)ie11解決方案

    ReactJS?應(yīng)用兼容ios9對標(biāo)ie11解決方案

    這篇文章主要為大家介紹了ReactJS?應(yīng)用兼容ios9對標(biāo)ie11解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • React中Redux Hooks的使用詳解

    React中Redux Hooks的使用詳解

    這篇文章主要介紹了React Redux Hooks的使用詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 深入理解react-router 路由的實現(xiàn)原理

    深入理解react-router 路由的實現(xiàn)原理

    這篇文章主要介紹了深入理解react-router 路由的實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • react map使用方法實例詳解

    react map使用方法實例詳解

    map()方法是在React中常用的數(shù)組處理方法之一,可以用于遍歷數(shù)組、生成組件列表以及進行數(shù)據(jù)轉(zhuǎn)換等操作,通過合理運用map()方法,可以更靈活地處理和展示數(shù)據(jù),下面給大家講解react map使用方法,感興趣的朋友一起看看吧
    2023-10-10
  • React使用TypeScript的最佳實踐和技巧

    React使用TypeScript的最佳實踐和技巧

    在React項目中使用TypeScript可以顯著提高代碼的可維護性和可讀性,并提供強大的類型檢查功能,減少運行時錯誤,以下是一些優(yōu)雅地將TypeScript集成到React項目中的最佳實踐和技巧,需要的朋友可以參考下
    2024-06-06
  • React八大常見錯誤及其解決方案

    React八大常見錯誤及其解決方案

    這篇文章主要介紹了React八大常見錯誤及其解決方案,并通過代碼示例介紹的非常詳細,對大家學(xué)習(xí)react有一定的幫助,感興趣的朋友可以參考下
    2024-03-03

最新評論

石泉县| 阆中市| 霍城县| 侯马市| 什邡市| 德钦县| 曲周县| 乌拉特中旗| 维西| 中西区| 综艺| 米脂县| 毕节市| 宝丰县| 稷山县| 酒泉市| 封开县| 晋江市| 台安县| 麻栗坡县| 桃源县| 清水河县| 勐海县| 苍梧县| 霍州市| 清新县| 大名县| 临颍县| 贡嘎县| 兴山县| 武功县| 中牟县| 修文县| 崇明县| 舞阳县| 浪卡子县| 延寿县| 锦屏县| 疏勒县| 腾冲县| 辽宁省|