zoukankan      html  css  js  c++  java
  • dva的全部用法

    index.tsx

    // users/index.tsx
    import React from 'react';
    import styles from './IndexPage.css';
    import { connect } from 'dva';

    const index = (props: any) => {
      const { dispatch, count } = props;
      console.log(props, count, count.current)
      const changeAdd = () => {
        // dispatch({ type: 'count/add1', payload: { record: 10, current: 21, name: 'add' } })

        dispatch({ type: 'count/getRemote' })
      }
      const changeMinus = (val: any) => {
        console.log('changeMinus', val)
        dispatch({ type: 'count/minus', payload: { record: 10, current: 21, name: 'add' } })
      }
      return (
        <div className={styles.normal}>
          <div className={styles.record}>
            Highest Record: {count.record}
          </div>
          <div className={styles.current}>
            {count.current}
          </div>
          <div className={styles.button}>
            <button onClick={changeAdd} >
              +
            </button>
          </div>
          <div className={styles.button}>
            <button onClick={() => changeMinus('sss')} >
              -
            </button>
          </div>
        </div >
      );
    }
    function mapStateToProps({ count }: any) {
      console.log('count', count)
      return { count }
      //return { count: count };
    } // 获取state
    //export default connect(({ count }) => ({ count }))(index)
    export default connect(mapStateToProps)(index);

    model.ts

    import { delay } from '../../utils/utils';
    import { getRemoteList } from './service';
    import key from 'keymaster';
    export default {
      namespace: 'count',
      state: {
        record: 0,
        current: 0,
      },
      reducers: {
        add1(state: any, { payload }: any) {
          console.log('ad', state, payload)
          const newCurrent = state.current + 1;
          return {
            ...state,
            record: newCurrent > state.record ? newCurrent : state.record,
            current: newCurrent,
          };
        },
        minus(state: any) {
          console.log('我进来了')
          return { ...state, current: state.current - 1 };
        },
      },
      effects: {
        *getRemote(action, { put, call }) {
          console.log('getRemoteList', getRemoteList)
          yield call(delay, 1000)
          const data = yield call(getRemoteList);
          console.log('data', data)
          yield put({
            type: 'add1',
            payload: data
          })
        }
      },
      subscriptions: {
        keyboardWatcher({ dispatch }: any) {
          console.log('我是建螃蟹')
          key('⌘+r, ctrl+r', () => { dispatch({ type: 'minus' }) });
        },
      },
    };

    在typings.d.ts中

    declare module 'keymaster';

    在utils/utils.js

    export function delay(timeout) {
      return new Promise((resolve) => {
        setTimeout(resolve, timeout);
      });
    }

    service.ts

    // service.ts文件
    
    export const getRemoteList = async (params: any) => {
      const data = [
        {
          key: '1',
          name: 'John Brown',
          age: 32,
          address: 'New York No. 1 Lake Park',
          tags: ['nice', 'developer'],
        },
        {
          key: '2',
          name: 'Jim Green',
          age: 42,
          address: 'London No. 1 Lake Park',
          tags: ['loser'],
        },
        {
          key: '3',
          name: 'Joe Black',
          age: 32,
          address: 'Sidney No. 1 Lake Park',
          tags: ['cool', 'teacher'],
        },
      ];
      return data;
    }

    总结:

    reducers是同步方法,用来改变state的值,
    dispatch({ type: 'count/add1', payload: { record: 10, current: 21, name: 'add' } }
    effects既可以异步也可以同步(一般用来异步)
    比如同步dispatch({ type: 'count/getRemote' })
    异步

     点击+按钮

     f12控制台

    subscriptions

    以 key/value 格式定义 subscription,subscription 是订阅,用于订阅一个数据源,然后根据需要 dispatch 相应的 action

    在 app.start() 时被执行,数据源可以是当前的时间、服务器的 websocket 连接、keyboard 输入、geolocation 变化、history 路由变化等等

    格式为 ({ dispatch, history }, done) => unlistenFunction

    注意:如果要使用 app.unmodel(),subscription 必须返回 unlisten 方法,用于取消数据订阅

    pathname值为url后面的路由
    // subscriptions 写法
    subscriptions: {
        setup({ dispatch, history }) {
          // 监听路由的变化,请求页面数据
          return history.listen(({ pathname, search }) => {
            const query = queryString.parse(search)
            let list = []
            if (pathname === 'todoList') {
              dispatch({ type: 'save', payload: {list} })
            }
          })
        }
      }
     
     

    参考https://www.jianshu.com/p/e184cd6d253c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    https://juejin.cn/post/6983855069850501127#heading-6

    https://juejin.cn/post/6844903669301788685#heading-4

  • 相关阅读:
    spring加载bean实例化顺序
    Java生成CSV文件实例详解
    JSch
    socket(一)
    Core Data
    运行时c函数
    ReactiveCocoa(RAC)
    先来个xmpp学习连接
    FMDB
    NSKeyedArchive(存储自定义对象)
  • 原文地址:https://www.cnblogs.com/lsc-boke/p/15049748.html
Copyright © 2011-2022 走看看