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

ReactNative?狀態(tài)管理redux使用詳解

 更新時(shí)間:2023年03月10日 08:54:15   作者:張拭心  
這篇文章主要介紹了ReactNative?狀態(tài)管理redux使用詳解

正文

有同學(xué)反饋開發(fā) ReactNative 應(yīng)用時(shí)狀態(tài)管理不是很明白,接下來幾篇文章我們來對(duì)比下 React 及 ReactNative 狀態(tài)管理常用的幾種框架的使用和優(yōu)缺點(diǎn)。

首先來看下 redux 怎么使用。

以下是使用 React 和 Redux 創(chuàng)建 todo list 的一般過程,完整代碼見文章末尾:

安裝和配置開發(fā)環(huán)境

安裝 Node.js 和 create-react-app 腳手架,用于快速創(chuàng)建 React 應(yīng)用程序

npx create-react-app playpage_ts -template typescript

安裝 React 和 Redux 關(guān)聯(lián)庫 redux 和 react-redux

npm install @reduxjs/toolkit react-redux

定義數(shù)據(jù)結(jié)構(gòu)

這里我們假設(shè) TODO 就是一個(gè)文本

export type TODO = {
    text: string
}
//1.定義狀態(tài)數(shù)據(jù)
export type State = {
    todos: TODO[]
}
  • 定義行為 action,比如添加、刪除:
//2.定義行為
//action
export const ADD_TODO = 'ADD_TODO';
export const DELETE_TODO = 'DELETE_TODO';
//action creator
const ACTION_CREATOR_ADD_TODO = (text:string) => {
    return {type: ADD_TODO, payload: text}
};
const ACTION_CREATOR_DELETE_TODO = (text:string) => {
    return {type: DELETE_TODO, payload: text}
};
//分發(fā)數(shù)據(jù)變更操作,接收 store.dispatch
export function DISPATCH_ADD_TODO(dispatch: any) {
    return (text: string) => {
        dispatch(ACTION_CREATOR_ADD_TODO(text))
    }
}
export function DISPATCH_DELETE_TODO(dispatch: any) {
    return (text: string) => {
        dispatch(ACTION_CREATOR_DELETE_TODO(text))
    }
}

上面的代碼里,首先定義了行為類型( action type):ADD_TODO 和 DELETE_TODO,它們用于唯一標(biāo)識(shí)一個(gè)狀態(tài)改變行為。

然后創(chuàng)建了兩個(gè) action creator :ACTION_CREATOR_ADD_TODO 和 ACTION_CREATOR_DELETE_TODO,它們用于創(chuàng)建符合 reducer 約定的 action 對(duì)象,其中 type 標(biāo)識(shí)行為類型,payload 表示傳遞的數(shù)據(jù)。

最后創(chuàng)建了兩個(gè)函數(shù):DISPATCH_ADD_TODO 和 DISPATCH_DELETE_TODO,它們用于分發(fā)數(shù)據(jù)變更操作,簡(jiǎn)化后續(xù) connect 里的代碼。

然后創(chuàng)建行為處理函數(shù) todoReducer

import { State, TODO } from "./model";
import { ADD_TODO, DELETE_TODO } from "./todoActions";
const initState : State = {
    todos: [
        {
            text: "clean room"
        }
    ]
};
//3.創(chuàng)建行為處理函數(shù)
const todoReducer = (state: State = initState, action: any): State => {
    switch(action.type) {
        case ADD_TODO:
            //返回一個(gè)新的狀態(tài)樹
            return {
                todos: [...state.todos, {text: action.payload}]
            };
        case DELETE_TODO:
            console.log('todoReducer delete >>>' + action.payload)
            const todos = state.todos.filter((item: TODO, index: number)=> {
                return item.text != action.payload
            });
            return {
                todos
            }
        default:
            console.log('return default>>>' + JSON.stringify(state))
            return state;
    }
};
export default todoReducer;

todoReducer 的作用是根據(jù)行為,返回新的狀態(tài)。

參數(shù)是先前的狀態(tài) state 和要執(zhí)行的行為 action,根據(jù) action type 行為類型,返回不同的數(shù)據(jù)。

需要注意的是,reducer 中不能修改老數(shù)據(jù),只能新建一個(gè)數(shù)據(jù)。

  • 創(chuàng)建一個(gè) store,參數(shù)就是上面創(chuàng)建的行為處理函數(shù):
import { createStore } from 'redux';
import todoReducer from './reducers';
//4.創(chuàng)建 store,提供全局的狀態(tài)和行為處理
const store = createStore(
    todoReducer
);
//監(jiān)聽數(shù)據(jù)變化
store.subscribe( () => {
    console.log("store changed >>>" + JSON.stringify(store.getState()))
})
export default store;
import { createStore } from 'redux';
import rootReducer from './reducers';
const store = createStore(
  rootReducer,
  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
export default store;
  • 分發(fā)給子元素:
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { Provider } from 'react-redux';
import ReduxTodoApp from './ReduxTodoApp';
import store from './redux/store';
const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
//5.分發(fā)給子元素
root.render(
  <Provider store={store}>
    <ReduxTodoApp/>
  </Provider>
);

上面的代碼中,我們使用使用 react-redux 的 Provider 包圍了 App 組件,這樣整個(gè) App 組件都可以獲取到 Store 中的狀態(tài)和行為處理函數(shù)。

ReduxTodoApp 是下一步要?jiǎng)?chuàng)建的 UI 組件

創(chuàng)建 UI 組件:

import {useState} from "react";
import { connect } from "react-redux";
import { State, TODO } from "./redux/model";
import {DISPATCH_ADD_TODO, DISPATCH_DELETE_TODO } from "./redux/todoActions";
//6.數(shù)據(jù)和 action 函數(shù)需要通過 prop 訪問
function ReduxTodoApp (prop: {todos: TODO[], addTodo: any, deleteTodo: any}) {
    const {todos, addTodo, deleteTodo} = prop;
    const [text, setText] = useState('');
    const handleInput = (e: any) => {
        setText(e.target.value)
    }
    const handleAddTodo = () => {
        addTodo(text)
        setText('')
    }
    const handleDeleteTodo = (text: string) => {
        deleteTodo(text)
    }
    return (
        <div style={{display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center'}}>
            <h1>This Is Redux TODO App.</h1>
            <ul>
                {todos.map((todo: TODO, index: any) => {
                    return (
                        <li key={index}>
                            <span>{todo.text}</span>
                            <button style={{marginLeft: '12px'}} onClick={() => handleDeleteTodo(todo.text)}>finish</button>
                        </li>
                    )
                })}
            </ul>
            <div style={{display: 'flex', flexDirection: 'row'}}>
                <input value={text} onChange={handleInput}/>
                <button onClick={handleAddTodo}>Add Todo</button>
            </div>
        </div>
    )
}
//外部的數(shù)據(jù)(即state對(duì)象)如何轉(zhuǎn)換為 UI 組件的參數(shù)
//mapStateToProps會(huì)訂閱 Store,每當(dāng)state更新的時(shí)候,就會(huì)自動(dòng)執(zhí)行,重新計(jì)算 UI 組件的參數(shù),從而觸發(fā) UI 組件的重新渲染。
const mapStateToProps = (state: State) => {
    console.log('mapStateToProps >>> ' + JSON.stringify(state))
    //返回的是一個(gè)對(duì)象,需要根據(jù)屬性名訪問
    return {
        todos: state.todos
    }   
}
//建立 UI 組件的參數(shù)到store.dispatch方法的映射
//定義了哪些用戶的操作應(yīng)該當(dāng)作 Action,傳給 Store
const mapDispatchToProps = (dispatch: any, ownProps: any) => {
    //返回一個(gè) Prop 對(duì)象
    return {
        addTodo: DISPATCH_ADD_TODO(dispatch),
        deleteTodo: DISPATCH_DELETE_TODO(dispatch)
    }
};
//5.組件接收數(shù)據(jù)和分發(fā)行為
export default connect(mapStateToProps, mapDispatchToProps) (ReduxTodoApp);

上面的代碼中,使用 connect 包裝了 UI 組件。

connect 的第一個(gè)參數(shù) mapStateToProps 用于返回當(dāng)前 UI 組件需要的數(shù)據(jù),這里我們獲取到 Store 中的 todos 列表。

第二個(gè)參數(shù) mapDispatchToProps 用于返回當(dāng)前 UI 組件需要向外分發(fā)的狀態(tài)操作行為,這里我們需要分發(fā)兩個(gè)行為:添加 todo 和刪除 todo,通過調(diào)用第二步中創(chuàng)建的 DISPATCH_ADD_TODO 和 DISPATCH_DELETE_TODO 實(shí)現(xiàn)。

正如名稱所示,mapStateToProps 和 mapDispatchToProps,最終都會(huì)向 Props 里添加成員。

這樣,我們的 UI 組件的 props 就會(huì)包含 mapStateToProps 中返回的狀態(tài)與 mapDispatchToProps 中的函數(shù),也就是這樣:

{
  todos: TODO[], 
  addTodo: any, 
  deleteTodo: any
}

注意名稱需要一致。

然后我們就可以在 UI 組件中通過 prop.todos 獲取數(shù)據(jù),通過 prop.addTodo 或者 prop.deleteTodo 通知修改數(shù)據(jù)。

總結(jié)一下,通過最原始的 redux 管理狀態(tài)分這幾步:

定義數(shù)據(jù)結(jié)構(gòu)類型,也就是前面的 State

  • 定義要進(jìn)行的數(shù)據(jù)修改行為 (action type),也就是前面的 ADD_TODO 和 DELETE_TODO
  • 然后創(chuàng)建 action creator,創(chuàng)建 reducer 里需要的 action 對(duì)象
  • 然后創(chuàng)建調(diào)用 store.dispatch 的函數(shù),簡(jiǎn)化 mapDispatchToProps 的代碼

有了行為后,然后就是處理行為,也就是 reducer

在其中根據(jù) action type,返回不同的狀態(tài)

有了 reducer 后,store 就齊全了,可以通過 createStore 創(chuàng)建一個(gè)全局唯一的 store

通過 react-redux 的 Provider 包裹整個(gè) app 組件,把 store 分發(fā)給所有組件

  • 最重要的一步:在 UI 組件里獲取數(shù)據(jù)和分發(fā)行為
  • 使用 react-redux 的 connect 包裹 UI 組件
  • connect 的第一個(gè)參數(shù)返回一個(gè)對(duì)象,在其中獲取 UI 組件里需要的數(shù)據(jù)
  • 第二個(gè)參數(shù)返回一個(gè)對(duì)象,其中包括要向外分發(fā)的行為
  • 在 UI 組件里通過 props.xxx 的方式獲取數(shù)據(jù)和分發(fā)行為

步驟有些繁瑣,但重要的是,行為和行為處理都拆分開,及時(shí)業(yè)務(wù)變得復(fù)雜,后續(xù)拓展也比較輕松。

如果要分析某個(gè)狀態(tài)修改操作,在 reducer 里增加日志即可定位到,這就是 redux 宣稱的優(yōu)勢(shì):“可追溯”。

完整代碼:github.com/shixinzhang…

以上就是ReactNative 狀態(tài)管理redux使用詳解的詳細(xì)內(nèi)容,更多關(guān)于ReactNative狀態(tài)管理redux 的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入理解React中何時(shí)使用箭頭函數(shù)

    深入理解React中何時(shí)使用箭頭函數(shù)

    對(duì)于剛學(xué)前端的大家來說,對(duì)于React中的事件監(jiān)聽寫法有所疑問很正常,特別是React中箭頭函數(shù)使用這塊,下面這篇文章主要給大家深入的講解了關(guān)于React中何時(shí)使用箭頭函數(shù)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • vite?+?react?+typescript?環(huán)境搭建小白入門教程

    vite?+?react?+typescript?環(huán)境搭建小白入門教程

    這篇文章主要介紹了vite?+?react?+typescript?環(huán)境搭建小白入門教程,本文通過示例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • react-router-dom6(對(duì)比?router5)快速入門指南

    react-router-dom6(對(duì)比?router5)快速入門指南

    這篇文章主要介紹了快速上手react-router-dom6(對(duì)比?router5),通過本文學(xué)習(xí)最新的react-router-dom?v6版本的路由知識(shí),并且會(huì)與v5老版本進(jìn)行一些對(duì)比,需要的朋友可以參考下
    2022-08-08
  • react?hooks?計(jì)數(shù)器實(shí)現(xiàn)代碼

    react?hooks?計(jì)數(shù)器實(shí)現(xiàn)代碼

    這篇文章主要介紹了react?hooks計(jì)數(shù)器實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 基于react后端渲染模板引擎noox發(fā)布使用

    基于react后端渲染模板引擎noox發(fā)布使用

    本篇文章主要介紹了基于react后端渲染模板引擎noox發(fā)布使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 使用useMutation和React Query發(fā)布數(shù)據(jù)demo

    使用useMutation和React Query發(fā)布數(shù)據(jù)demo

    這篇文章主要為大家介紹了使用useMutation和React Query發(fā)布數(shù)據(jù)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React聲明組件的方法總結(jié)

    React聲明組件的方法總結(jié)

    這篇文章主要給大家介紹了react聲明組件有哪幾種方法,各有什么不同,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • React實(shí)現(xiàn)Step組件的示例代碼

    React實(shí)現(xiàn)Step組件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)Step組件(步驟條組件)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • React?實(shí)現(xiàn)具備吸頂和吸底功能組件實(shí)例

    React?實(shí)現(xiàn)具備吸頂和吸底功能組件實(shí)例

    這篇文章主要為大家介紹了React?實(shí)現(xiàn)具備吸頂和吸底功能組件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • react中常見hook的使用方式

    react中常見hook的使用方式

    這篇文章主要介紹了react中常見hook的使用方式與區(qū)別,幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論

兰溪市| 安丘市| 武定县| 巩义市| 东乡族自治县| 株洲县| 准格尔旗| 阿拉善左旗| 中卫市| 游戏| 海淀区| 东乡县| 镇远县| 团风县| 宜兴市| 宁远县| 定远县| 沐川县| 库尔勒市| 华宁县| 花莲县| 章丘市| 新密市| 东山县| 定陶县| 洛隆县| 扶沟县| 寻乌县| 洛浦县| 都江堰市| 南江县| 天台县| 永和县| 商水县| 辉南县| 合山市| 三门县| 长沙市| 英超| 延津县| 平塘县|