• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • react-native 學習筆記

    標簽: react-native  hybridApp

    環境搭建:詳情見官網

    node、react-native-cli、python2、JDK1.8、AndroidStudio

    一、準備工作 選擇性安裝組件

    • redux:統一狀態管理
    • react-redux:提供provide、connect API,綁定react組件獲取store
    • redux-devtools:redux開發者工具,支持熱加載、action重放、自定義UI等
    • redux-thunk:實現action異步獲取數據的middleware
    • redux-persist:支持store本地持久化
    • redux-observable:實現可取消的action

    二、redux 介紹

    Redux的概念:把整個應用看成一個component,共享一個store,所有頁面都可以拿到store中的內容。當this.store中的state改變的時候,所有關聯的頁面就會刷新。這樣,不用寫global,不用寫通知。就可以跨頁面共享一個狀態。所有redux中的狀態都是可以全局拿到的。

    如:<SubComponent someProps={this.state.someState} />改變state來改變子控件UI的做法。所有用到rudux的頁面都是他的子控件。改變state,子頁面就都會跟著變。

    在這里插入圖片描述

    • subscribe:訂閱事件
    • state:狀態值
    • action:view改變store的唯一方式,store.dispatch(action)
    • reducer:純函數,接受參數state, action 返回newState

    三、react-redux 介紹

    • provider:包裹根組件,使所有子孫組件能通過connect高階函數綁定store

      class Index extends Component {
          render() {
              return {
                  <Provider store={store}>
                      <RootComponent/>
                  </Provider>
          	}
          }
      }
      
    • connect:高階函數,接受參數(mapStateToProps,mapDispatchToProps)(component,通過mapstatetoprops,mapdispacter參數獲取newState,并返回一個接受組件的高階函數,

      最終返回一個綁定store的Connect組件

    四、使用redux

    Redux的流程:
    store.dispatch(action) -> reducer處理action,返回一個新的state ->Store更新state ->相關UI更新

    • 創建action

      /**
       * action 類型
       */
       const ADD_TODO = 'ADD_TODO'
       
       /**
        * action 創建函數
        */
        export function addTodo(text) {
            return {
                type: ADD_TODO,
                result: text
            }
        }
      
    • 創建reducer

      export function reducerAdd (state, aciton) {
          switch(aciton.type) {
              // 返回即將改變的state,由store自己替換state的值
              case 'ADD_TODO' : return {...state, result: action.result}; 
              default: return state
           }
      }
      
    • 使用combineReducers

      • reducers/todos.js

        export default function todos(state = [], action) {
          switch (action.type) {
          case 'ADD_TODO':
            return state.concat([action.text])
          default:
            return state
          }
        }
        
      • reducers/counter.js

        export default function counter(state = 0, action) {
          switch (action.type) {
          case 'INCREMENT':
            return state + 1
          case 'DECREMENT':
            return state - 1
          default:
            return state
          }
        }
        
      • reducers/index.js

        import { combineReducers } from 'redux'
        import todos from './todos'
        import counter from './counter'
        
        export default combineReducers({
          todos,
          counter
        })
        
      • App.js

        import { createStore } from 'redux'
        import reducer from './reducers/index'
        
        let store = createStore(reducer)
        console.log(store.getState())
        // {
        //   counter: 0,
        //   todos: []
        // }
        
        store.dispatch({
          type: 'ADD_TODO',
          text: 'Use Redux'
        })
        console.log(store.getState())
        // {
        //   counter: 0,
        //   todos: [ 'Use Redux' ]
        // }
        
    • 使用action

      // 例子
      class Page extends React.Component {
        login = ()=>{
          //分發Action
          this.props.dispatch({type: 'INCREMENT'})
        }
        render(
          <View>
            <Text>{this.props.counter}</Text>
          </View>
        )
      }
      const mapStateToProps = state => {
          return {
              counter: state.counter,
          };
      };
      //關聯頁面和用到的模塊,store就會把子模塊的State通過props傳遞給此頁面
      export default connect(mapStateToProps)(Page);
      
    • redux-thunk

      允許action創建函數返回一個異步函數

      • 使用thunk
      import { createStore, applyMiddleware } from 'redux';
      import thunk from 'redux-thunk';
      import rootReducer from './reducers';
      // 創建store的時候,第二個參數是中間件,redux-thunk提供了一個thunk中間件,用于處理異步的action
      export default createStore(
        rootReducer,
        applyMiddleware(thunk)
      );
      
      
      • 使用場景
      //同步action
      export const initAction = (data) => ({
      	type: 'INIT_DATA',
      	data
      })
      
      //異步action
      export const getDataAction = () => {
          //這個方法有一個dispatch的參數,這個dispatch就是store里的dispatch.
          return (dispatch) => {
              axios.get('path').then((res) => {
              	let data = res.data
                  dispatch(initAction(data))
              })
          }
      }
      
      //組件中
      componentDidMount () {
          const action = getDataAction();
          store.dispatch(action);  
      }
      
      
    • redux-saga

    • redux-actions

    • redux-promise

    版權聲明:本文為q2235141原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/q2235141/article/details/93213126

    智能推薦

    一步一步學習 ReactNative + Redux(6)

    寫在開始 到這里,我們對 ReactNative 、Redux ,以及中間件、異步Action 都相當了解。 這篇,我們會把 TODO 添加也改為異步Action。http://www.jianshu.com/p/0bab91ba74dd 源碼:https://github.com/eylu/web-lib/tree/master/ReactReduxDemo/app_step6 調用遠程接口,添...

    一步一步學習 ReactNative + Redux(3)

    寫在開始 前篇中,我們介紹了 Redux ,對 Store 、 Action 、Reducer 有了初步的了解。并配合 react-redux ,梳理了其工作流程,結合使用了 Provider 、 connect() 。 接下來,我們完成開篇任務中的最后一項,過濾顯示 TODO 。http://www.jianshu.com/p/611fdc455e37 源碼:https://githu...

    一步一步學習 ReactNative + Redux(2)

    寫在開始 上篇中,我們搭建了 ReactNative + Redux 的結構、顯示了初始數據。http://www.jianshu.com/p/adf8886f5408 這篇,我們需要做狀態更改了,即 dispatch(action) 。 源碼:https://github.com/eylu/web-lib/tree/master/ReactReduxDemo/app_step...

    一步一步學習 ReactNative + Redux(1)

    寫在開始 上篇中,完成了 TODO 列表展示, TODO 項狀態更改,添加新 TODO。http://www.jianshu.com/p/4ceff3bbb414 只是使用的 React Native 方式控制 state,這里,我們開始使用 Redux 控制 state,也就是 React Native + Redux 開發。 源碼:https://github.com/ey...

    一步一步學習 ReactNative + Redux(0)

    寫在開始 研究 ReactNative 有一小段時間了,之前就聽過狀態管理 Redux 的大名,由于種種原因,沒深入了解。 這兩天有些許的時間,本想看看Redux,然鵝,一臉懵B ... 然后,經過三天三夜的大戰,漸入佳境。固,將一些心法心得記錄下來。 這是開篇,會慢慢演化如何使用 ReactNative + Redux 。 注意: 這里并沒有使用 Redux 這里并沒有使用 Redux 這里并沒...

    猜你喜歡

    ReactNative學習筆記之調用原生模塊(進階)之Callback、Promise使用

    前言 前文ReactNative學習筆記——調用原生模塊(Android)簡單說了下ReactNative調用Android原生模塊的基本用法,下面講解下調用原生模塊經常會用到的Callback和Promise。 很多時候我們可能不僅僅是調用Native的方法,還要通過原生方法獲取它的返回值,但是,前面說過,要導出一個方法給JavaScript使用,Java方法的返回類型必...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡