Vue简版文档

VUE

了解VUE

https://cn.vuejs.org/index.html

这两年国内最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angular.js和react.js的优点,并剔除了它们的缺点”。授予了这么高的评价的vue.js,也是开源世界华人的骄傲,因为它的作者是位中国人–尤雨溪(Evan You)。

Vue.js 是一个基于MVVM模式的一套渐进式框架。它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js

###前端框架历史

  • jquery阶段(2006-2013)
    • 特点:节点操作简单易用,浏览器兼容
  • angular阶段(2009-2014)
    • 特点:MVC模式,双向数据绑定,依赖注入
  • react阶段(2013)
    • 特点:virtual DOM,性能上碾轧angularJS
  • vue阶段(2014-2016)
    • 特点:综合angular与react的优点,MVVM模式,是一款高性能高效率的框架

###架构模式
复杂的软件必须有清晰合理的架构,否则无法开发和维护

  • MVC

MVC模式的意思是,软件可以分成三个部分。
* 视图(View):用户界面
* 控制器(Controller):业务逻辑
* 模型(Model):数据保存

![MVC](./img/mvc.png "Optional title")

* View 传送指令到 Controller
* Controller 完成业务逻辑后,要求 Model 改变状态
* Model 将新的数据发送到 View,用户得到反馈
  • MVP

MVP 架构模式是 MVC 的一个变种

  • View
  • Model
  • Presenter 可以理解为松散的控制器,其中包含了视图的 UI 业务逻辑,所有从视图发出的事件,都会通过代理给 Presenter 进行处理;同时,Presenter 也通过视图暴露的接口与其进行通信。
![MVP](./img/mvp.png "Optional title")
  • MVVM

由MVP模式演变而来

  • View
  • Model
  • ViewModel 类似与MVP中的Presenter,唯一的区别是,它采用双向绑定:View的变动,自动反映在 ViewModel,反之亦然
![MVVM](./img/mvvm.png "Optional title")

- 核心思想:关注Model的变化,让MVVM框架利用自己的机制去自动更新DOM,从而把开发者从操作DOM的繁琐中解脱出来!
安装和引入
  • 开发环境:development
  • 生产环境:production

  • script标签

  • cdn

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
  • npm

能很好和webpack等打包工具配合使用

  • vue-cli脚手架

快速的搭建基于webpack的开发环境

使用

实例化

    var data = { name: 'laoxie' }
    var vm = new Vue({
      el: '#app',
      data: data
    });

常用配置选项
  • 关于DOM节点

    • el(类型:Selector|Element)

    Vue实例的挂载目标,挂载元素会被 Vue 生成的 DOM 替换

    • template(类型:String)

    模板,如果不指定则以ele所在元素作为模板

      * Selector:提取内容到template标签,并指定选择器
    
  • 关于数据

    • data(类型:Object|Function)

    当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性,当这些数据改变时,视图会进行重渲染

    • computed(类型:Object)

    对于需要复杂逻辑或运算才能得到的值,应当使用计算属性

    • methods(类型:Object)

    一般用于编写公共方法、事件处理函数等,方法中的this指向实例,所以不应该使用箭头函数来定义 method 函数

    • watch(Object)

    监听属性(Function),监听的值被修改时会自动调用函数,当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的

        watch: {
            username: function (val, oldVal) {
                console.log('new: %s, old: %s', val, oldVal)
            }
        },
    
    • render

    字符串模板template的代替方案,允许你发挥 JavaScript 最大的编程能力。该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode
    * 优先级:render > template > ele.innerHTML

实例属性&方法
  • 响应式数据属性
    • 遍历data中所有属性,设置它们的getter & setter,并写入Vue的实例
    • 双向数据绑定原理
  • 内置属性

除了数据属性,Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来

  • $data 同 data
  • $el 同 el节点
  • $parent
  • $children
  • $root
  • 方法

    • 数据data
      • $watch():监听数据变化,同watch配置选项
      • $set(target,key,val):Vue.set()的别名,向响应式系统中的对象添加属性并自动渲染

      注意:target对象不能是 Vue 实例,或者 Vue 实例的根数据对象

    • 事件event
      • $on() :监听当前实例上的自定义事件
      • $off() :移除自定义事件监听器
      • $emit() :触发当前实例上的事件
    • 生命周期函数
      • $mount() :

      如果 Vue 实例在实例化时没有配置 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。可以使用 vm.$mount() 手动地挂载一个未挂载的实例

      • $destroy()

      完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令及事件监听器。触发 beforeDestroy 和 destroyed 的钩子

      • $nextTick(callback)

      同Vue.nextTick(),将回调延迟到下次 DOM 更新循环之后执行

      • $forceUpdate() 强制刷新组件
        vm.$watch('name', function (newValue, oldValue) {
          // 这个回调将在 `vm.name` 改变后调用
        });
    
生命周期

生命周期函数(钩子函数)

在某个时刻被自动执行的函数,this指向实例,以下为1.x与2.x钩子函数对照表:

  • beforeCreate()

应用:可以在这加个loading事件

  • created()

应用:在这结束loading,还做一些初始化,实现函数自执行

  • beforeMount()

应用:在这发起后端请求,拿回数据,配合路由钩子做一些事情

  • mounted()
  • beforeUpdate()
  • updated()
  • beforeDestroy()
  • destroyed()

执行destroy()后,不会改变已生成的DOM节点,但后续就不再受vue控制了。

指令directive

指令是带有 v-* 前缀的特殊属性,格式:v-指令名:参数.修饰符

内置指令、数据绑定

单向数据绑定

  • {{}}:插值表达式

差值表达式中应当放置一些简单的运算(data中的数据、函数执行、三元运算等),对于任何复杂逻辑,你都应当使用计算属性操作完成后再写入插值表达式

  • v-text:显示文本

  • v-html:显示html内容

  • v-bind:可绑定任意属性

    <img v-bind:src="imgurl">
    <!-- 简写  -->
    <img :src="imgurl">
    
    • 对style与class的绑定

    在将 v-bind 用于 class 和 style 时,Vue做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组

    	<div class="static"
            v-bind:class="{ active: isActive, 'text-danger': hasError }" 
            v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">
    	</div>
    	<div v-bind:class="this.isActive ? 'primary_nav_2 active' : 'primary_nav_2'"
    	     v-bind:style="{ background: this.isActive? 'orangered':'#bbb' }">
    	</div>
    	<div v-bind:style="{display: isActive? 'block' : 'none'}">
    	</div>
        <script>
            new Vue({
                data: {
                    isActive: true,
                    hasError: false,
                    activeColor: 'red',
                    fontSize: 30
                }
            })
        </script>
        <!-- 最终结果:<div class="static active" style="color:red;font-size:30px"></div> -->
    

列表渲染

  • v-for
    • 遍历数组
        <li v-for = "(value, index) in arr">{{value}}</li>
    
    • 遍历对象
        <tr v-for = "(value, key, index) in obj"></tr>
    
  • key

Vue对相同的元素进行展示排序等操作时,遵循“就地复用”原则,指定key属性后,意为去掉“就地复用”特性

v-model双向数据绑定

v-model一般用于表单元素,会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源

  • 单行文本框text

v-model值绑定到value属性

  • 多行文本框textarea

v-model值绑定到value属性

  • 单选框radio

v-model值绑定到value属性

  • 复选框checkbox
    • 初始值为数组,与value属性绑定
    • 初始值为其他,与checked属性绑定(true,false)
      • true-value:设置选中时的值
      • false-value:设置补选中时的值
  • 选择框select

v-model值绑定到value属性,无value属性则与内容绑定

  • 修饰符
    • lazy
    • number
    • trim

显示隐藏

  • v-show
  • v-if
    • v-else
    • v-else-if

事件绑定

格式:v-on:事件类型=“事件处理函数” 简写: @事件类型=“事件处理函数”

  • v-on
  • 事件修饰符
    • stop
    • prevent
    • capture
    • self 只当在 event.target 是当前元素自身时触发处理函数
    • once 事件将只会触发一次
    • 按键修饰符
      • 直接使用键码来作为按键修饰符
    <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
    <input v-on:keyup.13="submit">
  • 使用别名作为按键修饰符
    • left,up,right,down
    • enter
    • tab
    • esc
    • space
	//vue中传入多个参数和点击对象
    <li @click="Tab(1,$event)" id="box">
    	<img src="" alt=""/>
    </li>
    
	Tab(num,event){
		var el = event.currentTarget // 这样获取到的是被点击的元素自身 <li id="box"><img src="" alt=""/></li>
		var ev = event.target 		 // 这样获取到的是事件源对象		  <img src="" alt=""/>
		console.log(num)			 // 1
	}

自定义指令

  • 全局指令
    • 格式:Vue.directive(name,option)
    • 参数
      • name:指令名字,使用格式:v-name
      • option
        • Object:放钩子函数
        • Function:默认为bind和update的钩子函数
  • 局部指令
    格式:directives: {}
  • 钩子函数(了解)
    • bind:初始化时执行(默认)
    • inserted:元素插入页面时执行
    • update:所在模板更新时执行
    • componentUpdated:所在模板完成一次更新周期时调用
    • unbind:指令与元素解绑时执行
    • 参数
      • el 指令所绑定的元素,可以用来直接操作 DOM
      • binding 一个对象,包含以下案例中的属性
      • vnode
      • oldVnode

      仅在update 和 componentUpdated 钩子中可用

   // 使用指令:v-laoxie
    Vue.directive('laoxie', {
      bind: function (el, binding, vnode) {

        //binding参数如下
        el.innerHTML =
          'name: '       + JSON.stringify(binding.name) + '<br>' + //指令名
          'value: '      + JSON.stringify(binding.value) + '<br>' + //指令值
          'expression: ' + JSON.stringify(binding.expression) + '<br>' + //字符串形式的指令表达式
          'arg: '        + JSON.stringify(binding.arg) + '<br>' + //指令参数,
          'modifiers: '  + JSON.stringify(binding.modifiers) + '<br>' + //指令修饰符
      }
    });

过滤器

Vue允许你自定义过滤器,可被用于一些常见的文本格式化。
过滤器可以用在两个地方:双花括号插值和 v-bind

    <!-- 在双花括号中 -->
    {{ message | capitalize }}

    <!-- 在 `v-bind` 中 -->
    <div v-bind:id="rawId | formatId"></div>

全局过滤器

格式:Vue.filter(name,definition)

局部过滤器

格式:filters属性

    // 首字母大写
    Vue.filter('capitalize', function (value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    })

【案例】

  • tab标签切换
  • 表格操作
  • todolist待办事项列表
  • 编写自动获得焦点指令

【练习】

  • 编写返回顶部指令
  • 全选反选案例
  • 商品列表排序
  • 日期格式化过滤器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值