美文网首页
vue实例说明(this指向)及页面初始化时dom会闪一下的原因

vue实例说明(this指向)及页面初始化时dom会闪一下的原因

作者: JessyMa | 来源:发表于2018-04-17 18:58 被阅读0次

在用vue搭建页面时有一些变量是一开始是空的,页面一挂载mounted就赋值的,如这种情况

html
    <div class="productBox" v-for="(item,index) in prolists" :key="index">
          <p class="productName">{{item.name}}</p>
          <p class="createTime">{{item.createdDate}}</p>
   </div>
js
   var vm=new Vue({
        el:'#globel',
        data:{
            prolists:[]
        },
        created:function(){
           console.log(this.prolists);//空数组对象
           //单页面就没有导入axios
            $.ajax({
                method: "GET",
                url:"xxxxx",
                success:function(result){
                  var prodata=JSON.parse(result);
                  vm.prolists=prodata.data;
                  console.log(this.prolists);//未定义,因为this是ajax实例
                  console.log(vm.prolists);
              }
          });           
        },
        methods:{
        }
    })

每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的, Vue 的设计受到了MVVM的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。

当创建一个 Vue 实例时要经过一系列的初始化过程,在实例生命周期的不同阶段被调用,如 created、 [mounted(https://cn.vuejs.org/v2/api/#mounted)、updateddestroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。

不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a)vm.$watch('a', newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,经常导致 Uncaught TypeError: Cannot read property of undefinedUncaught TypeError: this.myMethod is not a function 之类的错误。
computed、methods、watch将被混入到 Vue 实例中。 this 上下文自动地绑定为 Vue 实例。
一定要弄清楚this的指向问题,如ajax请求里的this为ajax实例而不是vue实例,而定时器里的this是windows所以一般需要在后面bind(this),所以记住函数中this的指向为谁调用就是谁。
你也可以在 API 文档 中浏览完整的选项列表。

数据赋值前闪一下

在数据被赋值之前页面里可能会先闪现{{item.name}} {{item.createdDate}}然后再被真实数据替代,很丑有木有。
所以说要在数据赋予之前让其隐藏有几种方法:
1、v-cloak

  • 不需要表达式

  • 用法

    这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。

  • 示例

[v-cloak] {
  display: none;
}
<div v-cloak>
  {{ message }}
</div>

不会显示,直到编译结束。

2、使用v-text
<p class="productName">{{item.name}}</p>替换成<p class="productName" v-text="item.name"></p>完美解决
3、v-html(不建议)
更新元素的 innerHTML 。注意:内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译 。如果试图使用 v-html 组合模板,可以重新考虑是否通过使用组件来替代。
在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击。只在可信内容上使用 v-html永不用在用户提交的内容上。
4、v-if 和v-show
根据表达式之真假值,切换元素的 display CSS 属性。
当条件变化时该指令触发过渡效果。
数据赋予前使其为false,之后赋值为true

相关文章

  • vue实例说明(this指向)及页面初始化时dom会闪一下的原因

    在用vue搭建页面时有一些变量是一开始是空的,页面一挂载mounted就赋值的,如这种情况 每个 Vue 应用都是...

  • vue生命周期

    每个vue实例在被创建之前都要经过初始化。例如观测数据,初始化事件,挂载Dom,同时data变化时,更新Dom,在...

  • 4. 生命周期

    vue实例在被创建的时候都要经过一系列的初始化过程,如,设置数据监听,编译模板,将实例挂载到dom并在数据变化时更...

  • Vue生命周期

    在 Vue 实例中,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM,便需要使用到生命...

  • VUE生命周期

    vue实例从创建到销毁的过程就是vue生命周期;及指从创建、初始化数据、编译模板,挂载dom到渲染、更新到渲染,销...

  • vue实例方法

    $mount 如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。...

  • 一些好用但是不常用的vue属性

    $mount() 如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元...

  • Vue 依赖收集原理分析

    Vue 依赖收集原理分析 Vue实例在初始化时,可以接受以下几类数据: 模板 初始化数据 传递给组件的属性值 co...

  • React-Native 生命周期

    实例化 ============= 组件类型首次**实例化时初始化默认props属性,多实例共享 实例化时初始化默...

  • vue中使用 v-if 和v-else-if 控制元素的显示与隐

    问题描述 最近做项目,使用vue的v-if指令来控制元素的显示与隐藏,在页面初始化时出现页面中某些元素的会闪现; ...

网友评论

      本文标题:vue实例说明(this指向)及页面初始化时dom会闪一下的原因

      本文链接:https://www.haomeiwen.com/subject/sirpkftx.html