亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

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

2024-05-06 16:51:11
字體:
來源:轉載
供稿:網友

在React Native 中由于業務的需要, 我們往往要在諸多的頁面間,組件之間做一些參數的傳遞與管理, 在這里我總結了幾大經過驗證,穩定好用的方式給大家

React Navigation 導航傳值

推薦指數: ♥ ♥ ♥ ♥ ♥

適用范圍: 相互跳轉的頁面間傳值

兼容性: IOS/Android

原理: React Navigation 為頁面的 props 上掛載了 navigation 對象, 可用來做路由跳轉,在做頁面跳轉時可以攜帶參數/回調方法前往目標頁面, 從而達到傳參的目的

說明: 這是官方推薦,也是我們在業務開發中用得最多,最為推崇的一種傳參方式, 思想與 web 在 querystring 上帶參跳轉類似,只是實現方式略微不同, 舉例

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

正向傳值:

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

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

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

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

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

還是上面的例子:

當從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 參數就是 { id: '123', message: 'list really?'}

DeviceEventEmitter 觸發事件并傳值

推薦指數: ♥ ♥ ♥ ♥

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

兼容性: IOS/Android

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

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

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

在emit(觸發)事件后, 回調函數的入參就變成了我們所傳遞的 { name: 'Mega Galaxy'}, 

也可不傳值,不傳值時 callback 的入參就是 undefined

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

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

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

AsyncStorage Key-Value 式的存儲傳參

推薦指數: ♥ ♥ ♥ ♥

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

兼容性: IOS/Android

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

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

···

在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 式的存儲傳參,可能重點還是在數據存儲上, 且因為涉及到 I/O 的操作,在部份低端機型上,有卡頓的可能性

React Context Api 傳參(新版Context Api)

推薦指數: ♥ ♥ ♥ 

適用范圍: 不同頁面間的組件共享公共類的數據

兼容性: IOS/Android

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

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

 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>

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

Global 傳值

推薦指數: ♥ ♥ ♥ 

適用范圍: 頁面間傳值

兼容性: IOS/Android

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

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

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

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

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影免费观看高清完整版| 欧美一级视频一区二区| 91嫩草在线视频| 久久精品视频在线观看| 亚洲精品美女久久久| 国产在线98福利播放视频| 亚洲桃花岛网站| 亚洲免费电影一区| 亚洲va欧美va国产综合久久| 精品国产视频在线| 欧洲日本亚洲国产区| 成人黄色在线观看| 青青草精品毛片| 久热精品视频在线观看| 欧美激情图片区| 欧美激情视频一区| 亚洲天堂2020| 日韩精品中文字幕在线播放| 久久久综合av| 最近2019中文字幕在线高清| 欧美激情在线观看视频| 日日摸夜夜添一区| 亚州成人av在线| 亚洲一区中文字幕| 亚洲精品影视在线观看| 国产精品毛片a∨一区二区三区|国| 精品中文字幕乱| 亚洲一区二区日本| 精品久久久久久久久国产字幕| 日韩在线高清视频| 欧美日韩国产丝袜另类| 国产91九色视频| 亚洲伊人成综合成人网| 欧美猛交ⅹxxx乱大交视频| 91av视频在线免费观看| 最近的2019中文字幕免费一页| 一区二区三区四区在线观看视频| 亚洲精品国产精品久久清纯直播| 91成品人片a无限观看| 亚洲一区二区三区在线免费观看| 欧美壮男野外gaytube| 亚洲激情成人网| 国产在线999| 欧美午夜视频一区二区| www.久久久久久.com| 成人av色在线观看| 欧美丝袜一区二区三区| 日韩福利伦理影院免费| 午夜精品一区二区三区在线播放| 中文字幕自拍vr一区二区三区| 欧美国产日本高清在线| 亚洲国产精品成人一区二区| 精品国产欧美成人夜夜嗨| 国产精品女人网站| 国产不卡一区二区在线播放| 国产精品永久免费观看| 日韩电影在线观看永久视频免费网站| 91精品视频在线播放| 中文字幕一区日韩电影| 一二美女精品欧洲| 久青草国产97香蕉在线视频| 中文字幕精品国产| 欧美性猛交xxxxx水多| 国产成人精品免费视频| 日韩精品在线观看一区二区| 国产精品青青在线观看爽香蕉| 午夜精品福利视频| 欧美视频在线免费看| 国产精品99免视看9| 国产精品日本精品| 亚洲男人天堂网| 欧美综合国产精品久久丁香| 欧美区在线播放| 欧美高清视频免费观看| 亚洲精品美女免费| 国外视频精品毛片| 日韩av一区在线观看| 人人澡人人澡人人看欧美| 欧美美最猛性xxxxxx| 欧美黄色小视频| 亚洲精品自拍第一页| 国产欧美精品在线| 2020久久国产精品| 97视频网站入口| 色老头一区二区三区| 成人免费看片视频| 久久福利视频网| 日本久久亚洲电影| 一区二区中文字幕| 亚洲成人av片在线观看| 日韩精品丝袜在线| 国产精品第七影院| 久久偷看各类女兵18女厕嘘嘘| 久久久电影免费观看完整版| 午夜精品久久久久久久久久久久| 中文字幕日韩av| 91久久精品国产91久久性色| 国产精品高潮呻吟视频| 色噜噜亚洲精品中文字幕| 中文字幕精品久久久久| 久久视频在线视频| 欧美成人午夜视频| 国产成一区二区| 国产综合色香蕉精品| 992tv成人免费影院| 97久久精品人人澡人人爽缅北| 日韩电影在线观看免费| 亚洲成人三级在线| 欧美一区二区三区……| 久久久国产视频91| 亚洲欧洲一区二区三区在线观看| 国产一区二区欧美日韩| 一区二区三区天堂av| 日韩欧美在线观看视频| 国产做受高潮69| 欧美大胆在线视频| 国产一区二区在线播放| 国产精品稀缺呦系列在线| 亚洲欧美制服第一页| 欧美激情手机在线视频| 成人av在线天堂| 91在线国产电影| 国产精品福利网站| 日韩经典一区二区三区| 精品国产欧美成人夜夜嗨| 久久精品99久久久香蕉| 国产精品最新在线观看| 国产丝袜一区二区三区免费视频| 97成人在线视频| 国产精品美女午夜av| 久久免费精品日本久久中文字幕| 亚洲新声在线观看| 色妞久久福利网| 91久久国产婷婷一区二区| 国产精品久久久久久久av电影| 亚洲欧美日韩天堂一区二区| 亚洲电影免费观看高清| 日韩av日韩在线观看| 亚洲一区二区三区视频播放| 久久亚洲一区二区三区四区五区高| 国产91在线高潮白浆在线观看| 国模私拍视频一区| 亚洲人成绝费网站色www| 日韩中文字幕在线看| 日韩成人中文电影| 精品国偷自产在线视频| 色综合老司机第九色激情| 国产a∨精品一区二区三区不卡| 91精品视频一区| 久久香蕉精品香蕉| 91探花福利精品国产自产在线| 亚洲人成人99网站| 欧美激情免费在线| 国产一区二区三区丝袜| 国产精品欧美在线| 久久影视免费观看| 日韩亚洲精品电影| 欧美激情亚洲国产| 亚洲福利视频网| 日本一区二区在线免费播放| 久久视频在线免费观看| 欧美午夜美女看片| 国产成人一区二区三区小说| 日韩中文在线不卡|