vue学习笔记之基础篇
本文主要记录学习vue的一些基础内容及常用知识点的记录。
1、搭建脚手架
vue init webpack vue-demo 初始化一个使用webpack打包的vue项目
npm install 安装包的默认依赖
npm run dev 启动可以实现热加载
npm install vuex --save 安装其他包的命令,例如vuex
2、常用参数
基本参数
vue是一个MVVM框架,不再通过操作dom做交互,而是把重点放在数据层,可以分为:
data:绑定的数据,可以是基本类型和引用类型methods:视图绑定的方法components:局部组件的注册使用
监听属性
watch:数据监听,监听data中的数据,如果对应的数据改变,则执行监听逻辑
计算属性
computed:计算属性,根据其他的值计算出另一个结果。它的重要的特点是每次改变前使用缓存值,如果依赖的值没有改变则不计算。
    <div id="app">
        <input type="text" v-model="firstName">
        <input type="text" v-model="lastName">
        <span>{{fullName}}</span>
    </div>   
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                firstName:'',
                lastName:''
            },
            computed:{
                fullName(){
                    return this.firstName + this.lastName
                }
            }
        })
    </script>
计算属性的getter 和 setter,可以处理双向更改
computed:{
    fullName:{
        get(){
            return this.firstName + this.lastName
        },
        set(val){
            var valArr = val.split(',');
            this.firstName = valArr[0];
            this.lastName = valArr[1]
        }
    }
}
如果计算属性和监听属性都能做的事,优先使用计算属性~
3、vue指令
简单指令
- 数据模板渲染:
v-textv-html - 控制显示隐藏:
v-show(操作的是css属性display:none) - 属性指令:
:class="{red: isRed}":class="[classAName,{classB: isB}]"其中,classAName就是类名,但是isB是布尔值 - 表单指令:
v-model 
事件指令
事件绑定:v-on 或者 @ 后面是methods中的方法,如@click
事件修饰符:由点开头的指令后缀来表示
按键修饰符:将常用的按键以别名的形式便于业务场景控制
<!-- .enter -->
<!-- .tab -->
<!-- .delete -->
<!-- .up -->
<!-- .down -->
<!-- .left -->
<!-- .right -->
<input @keyup.enter="submit">
循环指令
循环指令:v-for="(item,index) in items"
- 结合使用 
:key="item.id"可以提升渲染的性能,key必须是唯一性标注 - 不可通过下标的方法改变数据值(数据变化但视图不变),尽量使用数组的原生方法(push/pop/shift/unshift/splice)或者直接改变整个数据的引用或者使用set方法,
 
set方法:
vm.$set(vm.items,2,{...})
- 渲染的内容必须在一个dom节点里,可以使用
template的占位符,用于包裹元素,但是不可与key同用 
   <div id="app">
       <div v-for="(item,index) of list" :key="item.id">
           <p>{{index+1}}:{{item.title}}</p>
           <span>{{item.content}}</span>
       </div>
   </div>
条件指令
v-if根据条件显示或隐藏(操作的是dom),一般结合v-else使用,必须紧贴一起使用
    <div id="app">
        <div v-if="char === 'a'">This is A</div>
        <div v-else-if="char === 'b'">This is B</div>
        <div v-else>This is Other</div>
    </div>
注意:vue在渲染dom的时候会尝试复用已经存在的dom,如果不需要这样,可以给对应的dom元素在上
key值,表示唯一性。
4、组件注册
全局注册
直接注册,可以全局使用
    // 全局注册组件
    Vue.component('my-component', {
        template: '<p>Hi! vue</p>'
    })
局部注册
    //可以直接写,使用脚手架的时候一般是一个.vue单组件
    var Child = {
        template: '<div>A custom component!</div>'
    }
    new Vue({
        components: {
            Child //es6的写法,当键和值一样的时候,可以省略写。这个时候使用:'<child></child>'渲染
        }
    })
5、父子组件通信
父-->子(props)
假设子组件叫child
- 父组件使用
 
    <!-- 将值放在属性中-->
    <child mumtell="听爸爸的话"></child>
- 子组件定义
 
export default {
  props: ['mumtell'],//子获取父的值,然后通过this.mumtell就可以获取对应的值了
}
- props拓展
可以指定数据的类型 
props:{
    mumtell:[String] //必须是字符串格式
}
可以指定校验
props:{
    type: String,
    required: false, // 必传
    default: '默认值',// 默认值
    validator:function(val){ //自定义校验
        return val.length > 5
    }
}
单向数据流:子组件不可以随意的修改从父组件传过来的参数,防止引用数据的共同改变。可以直接在子组件里复制一份父传来的值
子-->父($emit)
- 父组件中使用
 
    <child @tell="sonSay"></child>
    import Child from './child'
    export default {
        methods: {
            sonSay(msg){
                console.log(msg) // "HI,BABA"
            }
        },
        components: {
            Child
        }
    };
- 子组件定义
 
    export default {
        methods: {
            subClick() {
                let msg = "HI,BABA"
                this.$emit('tell',msg);
            }
        }
    }
6、is属性
使用场景:
- 某些情况下(比如组合标签)不可以直接写组件的名字,使用
is属性可以定义组件名 
    <div id="app">
        <table>
            <tbody>
                <tr is="row"></tr>
                <tr is="row"></tr>
            </tbody>
        </table>
    </div>
    <script>
        Vue.component('row',{
            template:'<tr>this is tr</tr>'
        })
        var vm = new Vue({
            el: '#app'
        })
    </script>
- 结合 
component构建动态组件 
    <component :is="tabName"></component>
    <script>
        var vm = new Vue({
            data(){
                return {
                    tabName: 'Child' //此时渲染成Child组件
                }
            }
        })
    </script>
一般结合计算属性使用,根据场景改变
tabName的值
7、钩子函数
vue的钩子函数,就是vue实例在某个时间点自动执行的函数
beforeCreate: 组件实例刚被创建,组件属性计算之前,使用场景如:可以加上loading事件;created: 组件实例创建已经完成,属性已绑定,但是dom未生成,使用场景如:结束loading时间,做一些初始化的操作;beforeMount: 模板编译/挂载 之前;mounted: 模板编译/挂载 之后;使用场景如:需要dom生成才执行一些初始化的操作;beforeUpdate: 组件更新之前;updated: 组件更新之后;beforeDestory: 组件销毁前destoryed: 组件销毁后activated: keep-alive组件激活时调用;deactivated: keep-alive组件停用时调用;
8、ref属性
用于访问组件的对象,指定了ref,就相当于挂载在 $refs 中,可以通过this.$refs[refName]获得对应的绑定数据
<div id="parent">
  <page-footer ref="pagefooter"></page-footer>
</div>
new Vue({
    el:'#parent',
    mouted(){
        //获取dom节点或组件的引用及绑定在组件上的数据
        console.log(this.$refs.pagefooter)
    }
})
注意:$refs只在组件渲染完成后才填充,并且它是非响应式的
9、slot插槽
不完全使用组件的HTML,有自定义的HTML的时候使用。
<!-- my-component 组件模板 -->
<div>
  <h2>我是子组件的标题</h2>
  <slot>
    自定义的HTML在这渲染
  </slot>
</div>
<div>
  <h1>我是父组件的标题</h1>
  <my-component>
    <p>11</p>
    <p>22</p>
  </my-component>
</div>
渲染结果:
<div>
  <h1>我是父组件的标题</h1>
  <div>
    <h2>我是子组件的标题</h2>
    <p>11</p>
    <p>22</p>
  </div>
</div>
- 多个插槽:可以用一个特殊的特性 name 来进一步配置如何分发内容。多个插槽可以有不同的名字
 
<!-- app-layout 组件模板-->
<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>
<app-layout>
  <h1 slot="header">11</h1>
  <p>22</p>
  <p>33</p>
  <p slot="footer">44</p>
</app-layout>
渲染结果为:
<div class="container">
  <header>
    <h1>11</h1>
  </header>
  <main>
    <p>22。</p>
    <p>33</p>
  </main>
  <footer>
    <p>44</p>
  </footer>
</div>
10、keep-alive
抽象组件:主要用于缓存不活动的组件实例
<keep-alive>
    <coma v-if="test"></coma>
    <comb v-else></comb>
</keep-alive>
<button @click="handleClick">切换显示</button>
export default {
    data () {
        return {
            test: true
        }
    },
    methods: {
        handleClick () {
            //点击组件发生切换,组件的状态被缓存,内容不会因为组件的切换而消息
            this.test = !this.test;
        }
    }
}
如果有的时候缓存的组件需要重新请求接口或重新渲染,可以结合使用
activated和deactivated这两个钩子,它们在组件切换的时候会执行。
vue学习笔记之基础篇的更多相关文章
- Django学习笔记(基础篇)
		
Django学习笔记(基础篇):http://www.cnblogs.com/wupeiqi/articles/5237704.html
 - Python学习笔记之基础篇(-)python介绍与安装
		
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
 - mysql学习笔记之基础篇
		
数据库学习之基础篇 ① 开放数据库互连(Open Database Connectivity,ODBC ② 结构化查询语言(Structured Query Language) ③ 进入mysql:M ...
 - java学习笔记之基础篇
		
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
 - Git学习笔记:基础篇
		
git可以说是所有开发者出开发语言之外的最基本的基本功了,熟悉git可以方便的进行代码版本控制,以及与其他开发者进行合作开发.本文内容是我以往学习git时做的笔记,主要是关于git最基本的操作,但 只 ...
 - Python 学习笔记(基础篇)
		
背景:今年开始搞 Data science ,学了 python 小半年,但一直没时间整理整理.这篇文章很基础,就是根据廖雪峰的 python 教程 整理了一下基础知识,再加上自己的一些拓展,方便自己 ...
 - Python学习笔记之基础篇(二)python入门
		
一.pycharm 的下载与安装: 使用教程:https://www.cnblogs.com/jin-xin/articles/9811379.html 破解的方法:http://xianchang. ...
 - datatables 学习笔记1  基础篇
		
本文共3部分:基本使用|遇到的问题|属性表 1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ...
 - Vue学习笔记:基础
		
Vue实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的 插值 数据绑定最常见的形式就是使用“Mustache”语法(双大括号)的文本插值 指令 指令的定义:Direct ...
 
随机推荐
- Java的引用和C++的指针de区别
			
Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别. (1)类型:引用其值 ...
 - 用 GitLab CI 进行持续集成
			
简介 从 GitLab 8.0 开始,GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成. ...
 - Python web前端 05 JavaScript
			
Python web前端 05 JavaScript 一.获取元素 1.初识JavaScript /* .. */ #这是多行注释 // #这是单行注释 #JavaScript是一种脚本语言,是一种动 ...
 - SQL Server2012如何更改服务器的名称
			
Problem: sql server 2012 安装完毕后,连接数据库只能使用 机器名\数据库实例 的方式,想用 localhost 或 . 作为服务器名称不可以 Solution: 参考:http ...
 - 如何写javascript代码隐藏和显示这个div
			
如何写javascript代码隐藏和显示这个div 浏览次数:82次悬赏分:10 | 解决时间:2011-4-21 14:41 | 提问者:hade_girl <div id="div ...
 - 最小生成树----prim算法的堆优化
			
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...
 - js关于原型,原型链的面试题
			
之前面试的时候遇到过原型和原型链方面的题目,具体的已经忘了,只记得当时回答的稀里糊涂,今天查了一些资料,把自己所理解的写出来,加深记忆. 1,前提 在js中,对象都有__proto__属性,一般这个是 ...
 - pip安装时的异常,找不到lib2to3\\Grammar.txt
			
[From] http://jahu.iteye.com/blog/2353325 异常 : [Errno 2] No such file or directory: 'd:\\python\\pyt ...
 - 前后端分离和restful开发规范
			
一.web开发的两种模式 1.前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高. 这种应用模式比 ...
 - webgoat环境搭建
			
链接: https://pan.baidu.com/s/1gfEKIyB 密码: 5zdq 1:配置Java环境变量,过程请找度娘 2:解压下载好的tomcat 3:将webgoat-containe ...