vue学习之的v-for,:key,@,ref,nextTick的使用以及生命周期函数介绍

1.v-for,:key,@,ref

下面是官方的文档,可以点进去看下,最好结合例子实践下。

例子

例子可以直接拷贝到(https://www.runoob.com/try/try-cdnjs.php?filename=vue2-v-for)实践。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue v-for</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<li v-for="(person,index) in array" :key="person.id">
	<input ref="inputx" id="inputx" v-model.lazy='person.name' @focus='focusEvent' />
</div>

<script>
new Vue({
  el: '#app',
  data: {
    array: [
      { id:1,name: 'armwind1' },
      { id:2,name: 'armwnid3' },
      { id:3,name: 'armwind2' },
      { id:4,name: 'armwnid4'}
    ]
  },
  methods:{
    focusEvent(event){
        var target = event.srcElement;
           this.$nextTick(()=>{
             let id = target.getAttribute("id");
			   console.log(id);
              if(id){
                let ta = this.$refs[id][3];
				  console.log(ta)
                //if(ta)
                  //ta.focus();
              }
         })
    }
}
})
</script>
</body>
</html>
  • v-for:vue的标签编译后不会显示出来的,能显示出来的都是标准的。从下面的调试页面能够卡纳都标准的html标签,其它vue的标签没有了。
    在这里插入图片描述
    这里就用下面的例子,其中person就是array中的元素,而index为默认的索引数据(从0开始).下面会有vue循环创建4个input输入框,并设置默认显示值和focus事件响应方法。
<div id="app">
<li v-for="(person,index) in array" :key="person.id">
	<input ref="inputx" id="inputx" v-model.lazy='person.name' @focus='focusEvent' />
</div>
  • @focus:这里是一个简写方式,其中v-on简写成了@,拓展出来为v-on:focus.看到不要在纠结了,其它事件,请参考官方文档。
  • “:key”:一开始看到前面加个:这个又是什么操作,原来:是v-bind的简写,对应v-bind:key。这里key值最好在data中设置一个对应的id,避免元素的重复渲染(参考例子:https://blog.csdn.net/qq_41609404/article/details/84064064)。
  • ref:这个是一个标签对象的引用对象。可以理解成C语言中的指针。直接可以在全局的$refs中找到这个元素的对象,操作相当方便。 ref官方文档

2.nextTick的使用和生命周期函数介绍

  • nextTick
    nexttick官方理解
    nexttick一开始也就没怎么理解,但是看着例子就明白了。说白了,它就是延迟执行的回调。 其它参考文章:https://www.jianshu.com/p/a7550c0e164f

将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue nextTick</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div class="app" ref="div_test">
  <div ref="msgDiv">{{msg}}</div>
  <div v-if="msg1">Msg1: {{msg1}}</div>
  <div v-if="msg2">Msg2: {{msg2}}</div>
  <div v-if="msg3">Msg3: {{msg3}}</div>
  <button @click="changeMsg">
    Change the Message
  </button>
</div>
    
<script>
new Vue({
  el: '.app',
  data: {
    msg: 'Hello Vue.',
    msg1: '',
    msg2: '',
    msg3: ''
  },
  methods: {
    changeMsg() {
      this.msg = "Hello world."
      this.msg1 = this.$refs.msgDiv.innerHTML
      console.log("msg1:"+this.msg1)
      this.$nextTick(() => {
        this.msg2 = this.$refs.msgDiv.innerHTML
		  console.log("msg2:"+this.msg2)
      })
      this.msg3 = this.$refs.msgDiv.innerHTML
		console.log("msg3:"+this.msg3)
      this.$refs.div_test.append("armwind"); // 增加一个对象到div
    }
  },
  beforeCreate(){
    console.log('beforecreate:')//null
  },
  created(){
        console.log('create:')//null
  },
  beforeMount(){
    console.log('beforeMount:')//null
  },
  mounted(){
    console.log('mounted:')//<p></p>
  },
  beforeUpdate(){
    console.log('beforeUpdate:')//null
  },
  updated(){
    console.log('updated:')//<p></p>
  }
})
</script>
</body>
</html>

上面的例子拖到浏览器中可以看到,一开始div元素下是没有添加"<div v-if="这样的3个标签,确认代之是三个注释符。此外可以看到生命周期函数打印了右下角4个生命 周期函数。
在这里插入图片描述
下面要注意的是源码中按理说log打印顺序是msg1,msg2,msg3,但是右下角可以看到,打印顺序是msg1,msg3,msg2,而msg2还是在beforeUpdate和updated之后打印的,这是为什么呢。这是由于nextTick就是为会在下一次页面更新后才执行的。由于页面已经更新了,所以this.$refs.msgDiv.innerHTML获取到就是"hello world"字符串,这里由于msg2的数据更新了。同样会触发页面更新,也就又会打印一次beforeupdate和updated函数。

-

  • 生命周期
    生命周期方法可以让我们知道可以在合适执行响应的操作,更多详细还是看官方文档。下面欣赏下官方流程图,很重要
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值