我想砍死我自己之vue的高级异步组件,react异步组件

目录:

  1. vue高级异步组件
  2. react异步组件

“今晚我真的想砍死我自己。。。。。。。。。。。。。。。。。

今晚我真的想砍死我自己。。。。。。。。。。。。。。。。。

今晚我真的想砍死我自己。。。。。。。。。。。。。。。。。”

********注意*下面纯属废话,吐槽,请忽略[***************************************************

从vue1到现在vue2,已经使用了vue有一年半的时间了。

之前vue1的时候写了一个微信论坛项目,可能是vue1的时候框架还不够完善或者只是自己没有了解到位,那时候项目用到的动态组件只是局限于路由。

常常遇到一个问题是,一个页面里面又多个tab,而每个tab里面分别对应不同的功能。有些tab比较常用,有些tab可能某些用户一年一不会点击一次。

每个tab单独写到一个文件然后import进来调用。这样可以减少tab之间的逻辑互相影响,同时让代码更加清晰和容易管理。”

我记得第一次写spa的时候,我还为此沾沾自喜过很长的一段时间。

SPA的遍历的确可以能解决很多传统开发模式无法解决的问题,但是也会带来某些问题,思考的范围也不再局限于浏览器兼容,文件压缩,页面特效。

在后来的一年半的时间里面,公司的工作模式随之VUE框架的推广开始前后分离,VUE也开始在不定期的活动项目上开始大行其道。由于活动项目相对来说,只有弹出交互,对产生的文件大小要求并不是很强。

最近突然感觉自己好久没有翻看过vue的文档了,心里有点不安的感觉,也许是时候复习下和总结下了吧

套用一个群友的吐槽话“忙,整天就知道忙,你是不是瞎了呀.”无厘头,但是却包含很多的无奈。

********上面纯属废话,吐槽,请忽略]***************************************************

来说说今天的问题:


Vue.js 允许将组件定义为一个工厂函数,动态地解析组件的定义。Vue.js 只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染,从而达到减少请求的目的(下面实例代码来自vue官网)

vue异步组件:

Vue.component('async-webpack-example',function (resolve) {
  // 这个特殊的 require 语法告诉 webpack
  // 自动将编译后的代码分割成不同的块,
  // 这些块将通过 Ajax 请求自动下载。
  require(['./my-async-component'],resolve)
})

Webpack 2 + ES2015 的语法返回一个promise:

Vue.component(
  'async-webpack-example',() => import('./my-async-component')
)

直接局部注册:

new Vue({
  // ...
  components: {
    'my-component': () => import('./my-async-component')
  }
})

这种普通方式的异步组件,我是知道怎么使用的,我查看的一篇博文也很清晰的对它做了再次说明


但是

高级异步组件的调用我就有点看不懂了


它这里强调了component返回的应该是promise,这个开始让我很纠结,或许我一开始就不应该把注意点放在这里,而是应该把原来的组件直接调用即可,这样就不会出现后来的故事。

导致我把重点放在这里的原因在于:我是经常使用import xx form “yy.vue” 这种形式来导入文件的,而且我很明确的知道这种形式返回的是我一个函数,而不是promise

最后证实import(“./mycomp.vue”)返回的的确是一个promise对象它和“import xx form “yy.vue”是不同的

情景重现:

看到了这里应当时一个promise的时候,我第一反应是不是自己应该把mycomp.vue封装成一个jsx的组件,然后export default new Promise

如果返回的是一个promise的话,那

component: import('./MyComp.vue'),

就应该改成函数如下:

添加sync 和await

const asyncCompa =  sync() => ({
  // 需要加载的组件。应当是一个 Promise
  component:await import("@/components/asynccomponents1"),loading: loading,// 出错时渲染的组件
  error: loading,delay: 3000,timeout: 10000
});

事实上我的确这样做了。然后就开始了一个晚上作死的行动~~~~自虐


结果:Failed to mount component:template or render function not defined

它意味着渲染函数有问题,我查看了父组件(语法没问题),子组件(因为export default new promise了,所有肯定不对)

我把子组件恢复了。

但是仍然不行

这时候我应该sync和await去掉的,如果这样的话我很快就能解决这个问题。但是没有。。。我没有意识到这个自作聪明的作死行为。

我百思不得其解,开始寻求谷歌的帮助。但是没有找到合适的解决方案。

我找到了这样的一个“由于问题过于水”而被关闭的问题https://segmentfault.com/q/1010000009936870/a-1020000009938303,我开始为他感到扼腕,开始不甘和咒骂。。。。巴拉巴拉...............


然后去群里帖代码,问大神。。。。。。。。。

但是可能对方也是一知半解,或者没有实际用过这个功能,,,,

于是乎,,一群人开始被我虐。。。。。。。。。


甚至有位大神直接给我发vue源码截图


虽然他并没有解决我的问题,但是能在手机上为我去阅读源码,这个的确让我十分的感动。我难以想象对方是什么样的水平同时非常震撼我们的差距到底有多大。

遇到问题,我出来jquery插件会看源码外,从来没有去看过框架的源码,从来都没有。。。。。。。。。。这个让我头疼,我头疼我是不是某个地方或者很多地方没有做到位。。。

虽然我的确在努力。。。但是同时经常被群友“小乔”喷“忙,忙,忙,就知道忙,你是不是瞎呀”.

就这样混混沌沌的在群友的陪伴下一个个代码的对和截图。。。。。。

突然有个人问,你哪里为什么要sync,去掉看看

果然,,,,,,,,可以。。。。。我坑了我自己。。。。

而且是走不出的坑直接把自己埋了。。。。。。。。。

水了这么久,帖下最终结果代码

父组件:

<template>
  <div>
      <a href="javascript:;" :class='[tab==0?"active":""]' @click="handle(0)">tab1</a>
      <a href="javascript:;" :class='[tab==1?"active":""]' @click="handle(1)">tab2</a>
      <div>
        <p>tab:{{tab}}</p>
        <async-compa v-if="tab==0"></async-compa>
      </div>
  </div>
</template>
<script>
import Vue from "vue";
import loading from "@/components/loading"
const y=import("@/components/asynccomponents1");
console.log("loading",loading)
console.log("y",y)
const asyncCompa =  () => sync({
  // 需要加载的组件。应当是一个 Promise
  component:await import("@/components/asynccomponents1"),//这个延时并不能让loading显示更长时间
  timeout: 10000
});
export default {
  name: "asyncCom",data() {
    return {
      tab: 1
    };
  },methods: {
    handle(index) {
      console.log(index);
      this.tab = index;
    }
  },moused: function() {},components: {
    asyncCompa
  }
};
</script>
 <style lang="less" scoped>
.active {
  color: red;
}
</style>

子组件:

<template>
  <div>111111</div>
  </template>
<script>
export default {
  name: "async-components1",data: function() {
    return {
      tab: "1"
    };
  }
};
</script>

当点击tab为0的时候,浏览器会从服务器加载异步子组件。如果tab不为0的时候,是不会加载的,

可以尝试打开页面后,把网络关掉然后再点击另外一个tab,会发现原来应该出现子组件的地方有一个不断在load的动画

这样可以直接减少大量的不需要用到的组件提高页面的执行效率

已经到晚上1点了,晚安。


迟一点再研究react的异步组件


2018/03/22 00:08更新

react异步组件:

react本身没有集成异步组件,["webpack import()"]不在说明范围内,因为这不属于react范畴,需要使用第三方库“react-loadable”它提供的功能和vue的高级异步组件一样,有timeout,delay,loading,error等可配置参数,下面直接贴代码:

主页面:

import React from 'react';
import Loadable from 'react-loadable';
import "./tab.less"
import Loading from '../../components/loading'

const LoadableComponent1 = Loadable({
  loader: () => import ('./content1'),loading: Loading,delay: 2000
});
const LoadableComponent2 = Loadable({
  loader: () => import ('./content2'),delay: 2000
});
class tab extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      index: 0
    };
    this.handleClick.bind(this);
  }
  componentDidMount() {
    //console.log("this.state",this.state)
  }
  componentWillMount() {}
  tabCompont() {
    return (
      <div>
        <span
          onClick={() => this.handleClick(0)}
          className={this.state.index == 0
          ? 'active'
          : ''}>111111</span>
        <span
          onClick={() => this.handleClick(1)}
          className={this.state.index == 1
          ? 'active'
          : ''}>2222222</span>
      </div>
    );
  }
  handleClick(index) {
    console.log("index",index)
    this.setState({index: index})
  }
  tabContentCompont() {
    return this.state.index == 0? <LoadableComponent1/>: <LoadableComponent2/>;
  }

  render() {

    return (
      <div>
        <h1>'Hello,world!'</h1>
        <div>
          {this.tabCompont()}
        </div>
        <div>
          {this.tabContentCompont()}
        </div>
      </div>
    );
  }
}
export default tab;

子页面和loading页面是普通的react页面,不展开说明。

值得强调的是,它的文档有说明需要对babel进行配置,我试了后没有效果,同事还报错了,没搞明白,最后用了现有项目的已经搭建好的配置,竟然不需要对babel进行配置

react-loadable比vue异步组件更方便的是,它可以加载多个资源

github地址

{
  "plugins": ["react-loadable/babel"]
}

它还有一个姐妹库react-loadable-visibility意思是可见的位置的组件才会加载,看起来非常的方便和厉害


这篇博文注定属于水货了,而且还是稀稀拉拉的滴水的那种。

就当做写日记吧

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom