VueJs中一些需要注意的点

Vue.js 何求龙
文章标签: Vue

1.给router-link绑定事件

vue-router中要使用<router-link>标签写入路由,在浏览器渲染的时候会把<router-link>标签渲染成

<a>标签,有时候需要为<router-link>注册事件,对于一般的html元素,直接使用@click="Fun"即可,

但是对于<router-link>,像普通html元素那样注册事件后并不管用,需要添加.native才会成功注册

实例代码:
        <!-- 未添加.native的点击事件,点击事件无效 -->
        <router-link to="/test1" @click='onClick'>点击</router-link>
        <!-- 添加.native的点击事件,事件注册成功 -->
        <router-link to="/test1" @click.native='onClick'>点击</router-link>

2.给组件绑定原生事件

        <!-- 事实上给组件绑定原生事件就需要.native修饰v-on,否则同样无法注册成功。 -->
	<component-test @click='onClick'></component-test>
	<component-test @click.native='onClick'></component-test>

3.v-for中的key

在做学生管理的时候,在vue文件里写v-for时发现报错。然后检查代码怎么都找不出问题,复制到HTML文件就不会报错了,然后就去查资料发现,在2.2.0+ 的版本里,当在组件中使用 v-for 时,key 是必须的,而我使用的是2.5.16版本,所以才会报错,那 key 又是什么呢?为什么一定要加 key 呢?首先 key是 vue 识别节点的一个通用机制,那有什么用呢?列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;这样当你修改其中某一条数据时,只会重新渲染修改过的数据,能很好的提升性能

实例代码:
  <body>
    <div id="app">
      <ul>
	<li v-for='(item, index) in list' :key='index'>name: {{item.name}}</li>
      </ul>
    </div>
    <script src="../lib/vue.js" type="text/javascript" charset="utf-8"></script>
    <script>
      var app = new Vue({
	el: "#app",
	data: {
	  list: [
	    {
		id: 1,
		name: 'test1',
	    }, {
		id: 2,
		name: 'test2',
	    }, {
		id: 3,
		name: 'test3',
	    }, 
	  ]
	},
      });
    </script>
  </body>

那该使用什么做为 key 呢?key 是用于识别节点的,所以必须是唯一的,一般会使用index(即数组的下标),如果是修改一些已渲染的数据这个是可以的,只会重新渲染修改过的数据。

list: [
  {
    id: 1,
    name: 'test1',
  }, {
    id: 2,
    name: '我是修改过的数据',
  }, {
    id: 3,
    name: 'test3',
  }, 
]
//修改了其中一条数据,重新渲染这一条,其它的复用之前的

插入一条数据到最后,这时候用index做为 key 是没问题的。

list: [
  {
    id: 1,
    name: 'test1',
  }, {
    id: 2,
    name: 'test2',
  }, {
    id: 3,
    name: 'test3',
  },  {
    id: 4,
    name: '我是添加到末尾的数据',
  }, 
] 

此时前三条数据直接复用之前的,新渲染最后一条数据,这个时候用index做为key是没问题的。

但是当在中间插一条数据。

list: [
  {
    id: 1,
    name: 'test1',
  }, {
    id: 4,
    name: '我是插队的一条数据',
  }, {
    id: 2,
    name: 'test2',
  },  {
    id: 3,
    name: 'test3',
  }, 
] 

再重新渲染你会发现除了第一条数据外,其它的数据都改变了

数据前后对比:
之前的数据                          之后的数据

key: 0  index: 0 name: test1       key: 0  index: 0 name: test1
key: 1  index: 1 name: test2       key: 1  index: 1 name: 我是插队的那条数据
key: 2  index: 2 name: test3       key: 2  index: 2 name: test2
                                   key: 3  index: 3 name: test3

明明只是添加了一条数据,只需要渲染一条数据就可以了,为什么却重新渲染了三条数据。很明显这样就达不到就地复用的效果,那最好的办法就是定一个不会改变的 key,你观察一下就会发现每条数据除了 index 外还有 id 也是唯一的,并且 id 不会像 index 一样发生改变,我们来看一下数据对比

之前的数据                               之后的数据

key: 1  id: 1 index: 0 name: test1       key: 1  id: 1 index: 0  name: test1
key: 2  id: 2 index: 1 name: test2       key: 4  id: 4 index: 1  name: 我是插队的那条数据
key: 3  id: 3 index: 2 name: test3       key: 2  id: 2 index: 2  name: test2
                                         key: 3  id: 3 index: 3  name: test3

发现了么,只有 id 为4的数据发生了改变,因此只要新渲染这一条数据就可以了,其他都是就复用之前的,这样当数据量大的时候就能很好的提升效率

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :