is、ref、$attrs、$nextTick、$set

1,is

用于动态组件且基于 DOM 内模板的限制来工作

<!-- 当 `currentView` 改变时,组件也跟着改变 -->
<component v-bind:is="currentView"></component>

2, ref

ref : 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。
如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;
如果用在子组件上,引用就指向组件实例

<p ref="p">hello</p>
<child-component ref="child"></child-component>
// 在 js 中,要获取的元素使用方法
this.$refs.child

注: ref 本身是基于渲染结果被创建的,在初始渲染的时候,不能访问它们,因为它们还不存在!$refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定

3, $attrs 传值

1,什么情况下用$attrs 来传值

当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件(在创建高级别的组件时非常有用)。

2,用法
  • 配置文件
    样式代码就不展示了
src
  component    // 组件
    attrsFather.vue
    attrsChild.vue
  view 
    attrs.vue  // 展示文件
  • attrs 页面内容
    这里通过组件 :modelType="modelType" 绑定值,子组件不需要通过props来接受值
    但是要传值的话,必须要一层一层绑定值来传递,如果不绑定,则停止传值
<template>
  <div class="hello" :modelType="modelType">
    <div class="mg-b20">我是 attrs 页面</div>
    <input type="text" v-model="value" @change="pull(value)"/>
    <!--这里是通过:modelType="modelType" 来绑定值 -->
    <attrsFather :modelType="modelType"></attrsFather>
  </div>
</template>
 
<script>
import attrsFather from "@/component/attrsFather.vue";
export default {
  name: "attrs",
  components: {
    attrsFather
  },
  data() {
    return {
        value:'',
        modelType:[]
    };
  },
  methods:{
    pull(value){
      this.modelType.push(value)
    }
  }
};
</script>
  • attrsFather 页面内容
<template>
  <div class="hello">
    <div>我是 attrsFather 页面</div>
     <div class="ly">
      <button @click="getValue">获取attrs页面的值</button>
      <div>attrs:{{attrsValue}}</div>
    </div>
   <!-- 文件中,通过attrsValue接收modelType值,继续绑定,才能传到下一个子组件中 -->
    <attrsChild :attrsValue="attrsValue"></attrsChild>
  </div>
</template>
 
<script>
import attrsChild from "@/component/attrsChild.vue";

export default {
  name: "attrsFather",
  components: {
    attrsChild
  },
  data() {
    return {
      attrsValue: []
    };
  },
  methods: {
    getValue() {
      this.attrsValue = this.$attrs.modelType;
    }
  }
};
</script>
  • attrsChild 页面内容
<template>
  <div class="child">
    <div>我是 attrsChild 页面</div>
    <div class="ly">
      <button @click="getValue">获取attrs页面的值</button>
      <div style="margin-left:20px;">attrs:{{attrsValue}}</div>
    </div>
  </div>
</template>
 
<script>
export default {
  name: "attrsChild",
  data() {
    return {
        attrsValue:[]
    };
  },
  methods: {
    getValue() {
        this.attrsValue = this.$attrs.attrsValue;
    }
  }
};
</script>
git.gif

4,$nextTick

1,$nextTick方法作用

在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM。

2,语法:Vue.nextTick([callback, context])

参数:
callback:是函数;回调函数,不传时提供promise调用
context:是对象;回调函数执行的上下文环境,不传默认是自动绑定到调用它的实例上。

3,dome
<div>
      <div>$nextTick学习</div>
      <button v-if="showState" @click="changeState()">点击展示input框</button>
      <input type="text" ref="inputShow" v-else />
</div>
changeState() {
  this.showState = false;
  this.$refs.inputShow.focus();
}

当写完之后,我们操作页面,会显示报错


git.gif

这个是为什么呢?
因为当this.showState = false时,页面需要重新渲染页面,但是 this.$refs.inputShow.focus()不等页面渲染完成之后,就开始执行了,但是此时页面还是旧的页面,新页面还未渲染,所以就会报错Cannot read property 'focus' of undefined
所以我们要把 this.$refs.inputShow.focus()操作延迟,延迟到新页面dome渲染成功后,再执行此操作,$nextTick就是这么一个操作,所以,我们要进行修改为

changeState() {
      this.showState = false;
      // 当组件根据最新的data数据重新渲染完成之后,再执行函数中的操作
      this.$nextTick(function() {
        this.$refs.inputShow.focus();
      });
 }
git.gif

5,$set

1,场景:vue数据修改可以进行视图更新
在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。

2,场景:vue数据修改可以进行视图不更新

  • 为什么?
    受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。

  • 解决方法:用 $set 方法,新添加的属性值会被Vue监听到并且同步渲染到页面上

 //渲染数据时,数值改变了,但是视图没有更新
arr[index] = newVal ;
//因为vue无法监听到复杂数据内部数值变化,
//使用 vm.$set实例方法,这也是全局 Vue.set方法的别名,$set可以触发更新视图:
this.$set( target, key, value ); 
Vue.set( target, key, value ); //通过Vue.set方法,$set可以触发更新视图

注:调用方法:Vue.set( target, key, value );
target:要更改的数据源(可以是对象或者数组);
key:要更改的具体数据;
value :重新赋的值;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 1.key key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes...
    bayi_lzp阅读 2,255评论 0 2
  • 以下内容是我在学习和研究Vue时,对Vue的特性、重点和注意事项的提取、精练和总结,可以做为Vue特性的字典; 1...
    科研者阅读 14,072评论 3 24
  • 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装...
    youins阅读 9,475评论 0 13
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 3,824评论 5 14
  • 类和对象 类是对象的模子对象是类的具体实例 类由类名,属性,方法三部分构成需正确区分属性与方法一般名词属于类,例如...
    小胡123阅读 144评论 0 0