umi+dva+antd后台管理系统(5)---dva loading

在开始增删改查之前,我又加了个加载数据的loading效果~ 这篇附带promise和生成器函数
源码在这儿MyGithub,觉得不错留颗小星星哦~

1. loading效果

loading
其实也不难,我的思路是:初始化设置loading为false,在发起网络请求的时候更新为true,展示加载状态,待数据请求过后,同步数据的时候,loading重新设置为false即可。然后UI组件那边负责接收这个loading和展示这个 loading即可。

models:
export default {
  namespace: 'product',
  state: {
    products: [],
    loading:false
  },
  reducers: {
    save(state, { payload }) {
      return { ...state, ...payload,loading:false};
    },
    showLoading(state,action){
      console.log("网络请求里改变loading的状态了")
      return{...state,loading:true}
    }
  },
  effects: {
    *loadData({ payload }, { call, put }) {
      yield put({type:'showLoading'})
      const result = yield call(list);
      yield put({
        type: 'save',
        payload: {
          products: result.data,
        },
      });
    },
  },
};

render:
const { products ,loading} = this.props;
···
return (
      <div>
        <Table  ··· loading={loading} ··· />,
      </div>
    );

瞅瞅
注意:
1. 这个更新为true一定要在你发请求之前,道理大家都懂
2. 数据加载很快可能不太明显,想清晰的看自己的缓冲效果可以加个延时器
3. effect里的异步函数用生成器函数写,后面要跟Promise类型的函数体,所以,延时器这么加,如下:

export const list =()=>{
  return new Promise((reslove, reject)=>{
    setTimeout(()=>{
      instance.GET('/api/detail')
      .then(res=>{
        reslove(res)
      })
    },10000)
  })
  // return instance.GET('/api/detail')
}

2. loading 写完了,来说说Promise和生成器函数

  • promise

Js是单线程的,Promise解决就是异步编程一种思想,比传统的回调函数和事件强大好多。
Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上说Promise是一个对象,从它可以获取异步操作的信息。

  1. Promise对象的状态不受外界影响:

    penging :进行中
    fulfilled :已经成功
    rejected :已经失败

  2. 状态改变
    Promise对象的状态改变,只有两种可能:

    从pending变成fulfilled
    从pending变成rejected

基本用法:Promise对象是一个构造函数,用来生成Promise实例

const promist = new Promise(function(resolve,reject){
	if(/异步操作成功/){
			resolve(value);
		}else{
			reject(error);
		}
	})

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

  • Generator

在异步编程中,还有一种常用的解决方案,它就是Generator生成器函数。顾名思义,它是一个生成器,它也是一个状态机,内部拥有值及相关的状态,生成器返回一个迭代器Iterator对象,我们可以通过这个迭代器,手动地遍历相关的值、状态,保证正确的执行顺序。

  1. 声明
    generator的声明方式类似一般的函数声明,只是多了个*号,并且一般可以在函数内看到yield关键字
function* showWord(){
	yield 'one';
	yield 'two';
	return 'three';
}
var show = showWords();
show.next();
show.next();
show.next();
show.next();

如上代码,定义了一个showWords的生成器函数,调用之后返回了一个迭代器对象(即show)

调用next方法后,函数内执行第一条yield语句,输出当前的状态done(迭代器是否遍历完成)以及相应值(一般为yield关键字后面的运算结果)

每调用一次next,则执行一次yield语句,并在该处暂停,return完成之后,就退出了生成器函数,后续如果还有yield操作就不再执行了

哈哈,promise和生成器函数这段转载别人的~, 这里有地址:Here~,待我有空了,把我自己总结的发一发,我有一大堆呢,哼哼~ 我看这个和我理解的差不多,先用用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值