<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      redux初探

      action是一個普通對象 里面必須有一個type字段,代表將要執行的行為,其他字段自己規劃。

      action只是描述了將要發生的事情并不能直接修改狀態

      action創建函數 盡量是一個純函數,他返回的是action對象

      middleware 接受一個next() 的dispatch函數,返回了一個dispatch函數,將返回的dispatch函數作為下一個middleware的next() 一次類推可以達到鏈式的調用

       它提供的是位于 action 被發起之后,到達 reducer 之前的擴展點。 你可以利用 Redux middleware 來進行日志記錄、創建崩潰報告、調用異步接口或者路由等等。

      不管鏈式調用幾次dispatch 最后一次調用dispatch  必須是一個action不能是其他的。來達到數據來源的起點。

      import React from "react";
      import { render } from "react-dom";
      import { Provider } from "react-redux";
      import { createStore ,compose,applyMiddleware} from "redux";
      import App from "./components/app";
      import reducers from './reducers/index'
      import {addTodo} from './actions/index'
      const enhancers = compose(
        window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
        );
      const store = createStore(reducers,enhancers);
      const logger = (store)=>next=>action=>{
        console.log('action',action)
        let result = next(action)
        console.log('state',store.getState())
        return result
      }
      console.log(logger(store)(store.dispatch)(addTodo('abc')))
      //手動實現一個middleware 
      function middleware(stroe,middlewares){
        middlewares = middlewares.slice()
        middlewares.reverse()
        let dispatch = store.dispatch
        middlewares.forEach(middleware => {
          dispatch = middleware(stroe)(dispatch)
        })
        return Object.assign({},store,{dispatch})
      }
      console.log(middleware(store,[logger]))
      render(
        <Provider store={store}>
          <App />
        </Provider>,
        document.getElementById("root")
      );
      

       

       

       

      let nextTodoId = 0;
      
      export const addTodo = (text) => {
        return {
          type: "ADD",
          id: nextTodoId++,
          text,
        };
      };
      export const setVisibilityFilter = (filter) => ({
        type: "SET_VISIBILITY_FILTER",
        filter,
      });
      export const toggleTodo = (id) => ({
        type: "TOGGLE_TODO",
        id,
      });
      export const VisibilityFilters = {
        SHOW_ALL: "SHOW_ALL",
        SHOW_COMPLETED: "SHOW_COMPLETED",
        SHOW_ACTIVE: "SHOW_ACTIVE",
      };
      

       reducer函數接收二個參數,一個是舊的狀態樹,一個是actions對象  返回的是一個新的狀態樹

      可以創建多個子reducer,分別負責狀態樹中的一部分。最后創建一個根reducers

      //子reducers
      const todos = (state = [], action) => {
        switch (action.type) {
          case "ADD":
            return [
              ...state,
              {
                id: action.id,
                text: action.text,
                completed: false,
              },
            ];
            break;
          case "TOGGLE_TODO":
            return state.map((todo) =>
              todo.id == action.id ? { ...todo, completed: !todo.completed } : todo
            );
            break;
          default:
            return state;
            break;
        }
      };
      export default todos
      

       

      //根reducers
      import React from 'react'
      import { combineReducers } from 'redux'
      import todos from './todos'
      import visibilityFilter from './visibilityFilter'
      //自定義根reducers // const todoApp = (state={},action)=>({ // todos:todos(state.todos,action), // visibilityFilter:visibilityFilter(state.abc,action) // }) export default combineReducers({todos,visibilityFilter}) //combineReducers 將reducers 拆分成多個子reducers 并執行

       最后通過createStore 將狀態樹傳遞到頁面組件樹當中

      import React from "react";
      import { render } from "react-dom";
      import { Provider } from "react-redux";
      import { createStore ,compose} from "redux";
      import App from "./components/app";
      import reducers from './reducers/index'
      const enhancers = compose(
        window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
        );
      const store = createStore(reducers,enhancers);
      render(
        <Provider store={store}>
          <App />
        </Provider>,
        document.getElementById("root")
      
      )
      

       將redux應用到組件中時分為容器組件和展示組件,容器組件需要將展示組件連接到store上

      //容器組件
      import React from 'react'
      import { connect } from 'react-redux'
      import TodoList from '../components/TodoList'
      import {toggleTodo,VisibilityFilters} from '../actions/index'
      
      const getVisibleTodos = (todos,filter)=>{
        switch (filter) {
          case 'SHOW_ALL':
            return todos
            break;
          case 'SHOW_COMPLETED':
            return todos.filter((todo)=>todo.completed)
            break;
          case 'SHOW_ACTIVE':
            return todos.filter(t=>!t.completed)
            break;
          default:
            throw new Error('Unknown filter: ' + filter)
        }
      }
      
      const mapStateToProps = (state, ownProps) => {
        console.log(state)
        return {
          todos: getVisibleTodos(state.todos,state.visibilityFilter)
        }
      }
      const mapDispatchToProps = (dispatch, ownProps) => {
        return {
          toggleTodo: (id) => {
            dispatch(toggleTodo(id))
          }
        }
      }
      export default connect(mapStateToProps,mapDispatchToProps)(TodoList)
      

       

      //展示組件
      import React from 'react'
      import Todo from './Todo'
      const TodoList = ({todos,toggleTodo})=>{
        return (
          <ul>
            {todos.map(todo=>
              <Todo change={()=>toggleTodo(todo.id)} key={todo.id} {...todo} />
              )}
          </ul>
        )
      }
      export default TodoList
      

       

      posted @ 2020-08-05 17:27  飛奔的龜龜  閱讀(106)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美三级a做爰在线观看 | 在线a级毛片无码免费真人| 91精品国产自产91精品| 内丘县| 亚洲精品人妻中文字幕| 香蕉EEWW99国产精选免费| 亚洲国产精品日韩在线| 久久99日韩国产精品久久99| 又湿又紧又大又爽A视频男| 蜜桃视频一区二区在线观看| 夜夜影院未满十八勿进| 突泉县| 丝袜美腿亚洲综合在线观看视频| 成在线人永久免费视频播放| 亚洲高清WWW色好看美女| av偷拍亚洲一区二区三区| 亚洲午夜av久久久精品影院| 亚洲精品中文字幕尤物综合| 国产精品亚洲综合一区二区| 日本中文一区二区三区亚洲| 国产偷自视频区视频| 国产av熟女一区二区三区| 蜜桃AV抽搐高潮一区二区| 91久久精品国产性色也| 东京热一精品无码av| 宣汉县| 国产成人精品无人区一区| 色天天天综合网色天天| 麻豆一区二区中文字幕| 国产精品七七在线播放| 狠狠综合久久久久综| 国产精品综合一区二区三区 | 国产日韩精品免费二三氏| 国产精品自拍视频第一页| 狠狠色噜噜狠狠狠狠色综合久| 久久精品国产清自在天天线| 亚洲精品一区二区三区综合| 一本一本久久a久久综合精品| h动态图男女啪啪27报gif| 亚洲成人av在线资源网| 亚洲欧洲无码av电影在线观看|