什么是Vue

Vue 是一套用于构建用户界面的渐进式框架,也就是说你可以将vue作为应用的一部分嵌入其中,所以项目中既可以有vue也可以有其他的框架,以及关注度分离,使得vue只关注视图层。目前Vue与Angular,React一起并称为前端三大框架。在中国使用最广泛的就是Vue。

Vue 是美籍华人 尤雨溪 开发的,其中借鉴了React等其他框架的内容,但这并不妨碍它成为一个优秀的前端框架,由于作者是国人,所以其文档对国人相对更加友好,国内开发者能快速入门

MVVM

MVVM全称为 Model View ViewModel

Vue生命周期

生命周期是指vue实例从创建到销毁的过程,其中各个阶段都有对应的钩子函数,官方图示如下

Vue 安装方式

  1. 通过在线cdn导入

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

  2. 下载源文件并导入

    代码结构如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>


    </head>
    <body>
    <div id="app">
    {{message}}
    </div>
    <!-- 在线引入 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <!-- 本地引入 -->
    <!-- <script src="../js/vue.js"></script> -->
    <script>
    const app = new Vue({
    el: '#app',//挂载点,表示将vue实例对象挂载在哪个元素上
    data: {
    message:'hello '
    }
    })
    console.log(app)
    </script>
    </body>
    </html>
  3. 通过npm包管理器 安装cli脚手架

    1. 安装脚手架之前请确保全局安装过webpack npm i webpack -g

    2. 通过npm下载 vue脚手架 npm install vue-cli -g

    3. 在项目根目录下初始化工程 vue init webpack [项目名],具体操作如下

    4. 创建后项目目录结构如下

基础语法

以下演示皆使用VueCli

Mustache 插值

使用一对大括号包起来 即可完成Mustache插值操作

常用指令

  1. v-once

v-once指令只渲染第一次的数据,当渲染出来后,无论绑定的数据发生什么变化,页面上的值一直是第一次渲染的值

  1. v-html

使用v-html 命令,将数据转成html代码并渲染

  1. v-pre

v-pre 命令可以是标签里面的文本原封不动的渲染到页面上,不受data数据的影响

  1. v-on

    v-on 命令作为绑定事件监听器,标签中的各种事件如click,change都可以通过 v-on 指令来动态绑定

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <template>
    <div id="wapper">

    <div>{{count}}</div>

    <!-- 完整写法 -->
    <button v-on:click="count++" >+</button>

    <!-- 语法糖简写 -->
    <button @click="addCount()">++</button>

    <!-- 传递参数,count就是data数据中的变量 -->
    <button @click="showNub(count)"></button>

    <div @click="divClick()">
    <!-- .stop修饰符可以阻止冒泡 -->
    <button @click.stop="btnClick()"></button>
    </div>

    <form action="fishband">
    <!-- .prevent修饰符可以阻止默认行为 -->
    <input type="submit" value="提交" @click.prevent="submitClick()">
    </form>

    <!-- @keyup 可以监听键帽,当松开键盘时触发,keydown则按下键盘触发,若要监听空格键,加 上.enter即可 -->
    <input type="text" @keyup="keyup()">

    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return{
    count:0
    }
    },
    methods:{
    addCount(){
    this.count++
    },
    showNub(nub){
    console.log(nub)
    }
    }
    }
    </script>

    <style scoped>
    </style>

  2. v-bind

    1. 用于对标签的属性进行数据绑定 如href,src等属性,vue内置语法糖,可以简化为一个:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <template>
    <div id="wapper">

    <img v-bind:src="Imgurl">
    <a :href="link">点我看看</a>

    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return{
    className:'test1',
    Imgurl:'http://lc-Y09K/demo7.jpg,
    link: 'https://fishband.github.io'
    }
    },
    }
    </script>
    1. 用于动态绑定 class值,其后面的值可以跟一个对象,key为类名来自于数据绑定,value为boolean 为true时,则把key类名添加至class,为false则不添加,常用于样式切换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <template>
    <div id="wapper">

    <div :class="{bigFont: isBigFont , redFont: isRedFont}">try</div>
    <button @click="beRed()">点我变红</button>
    <button @click="beBig()">点我变大</button>

    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return{
    isBigFont:false,
    isRedFont:false
    }
    },
    methods:{
    beRed(){
    this.isRedFont = !this.isRedFont
    },
    beBig(){
    this.isBigFont = !this.isBigFont
    }
    }
    }
    </script>

    <style scoped>
    .bigFont{
    font-size: 100px;
    }
    .redFont{
    color: red;
    }
    </style>
    1. 动态绑定数组
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <template>
    <div id="wapper">

    <div :class="classList">try</div>
    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return{
    classList:null
    }
    },
    methods:{
    },
    beforeMount(){
    this.classList = ["bigFont","redFont"]
    }
    }
    </script>

    <style scoped>
    .bigFont{
    font-size: 100px;
    }
    .redFont{
    color: red;
    }
    </style>

  3. v-for

    v-for指令可以用于遍历渲染数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     <template>
    <div id="wapper">

    <div v-for="item in imgList">
    <img :src="item" />
    </div>

    <div v-for="item,index in imgList" :key="index">
    <!--使用 v-for 的时候提供 key 属性,以获得性能提升 -->
    <img :src="item" />{{index}}
    </div>

    <div v-for="item,index in jsonList">
    name is {{item.name}},age is {{item.age}}
    </div>

    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return{
    imgList:['http://lc-Y0demo8.jpg','http://lc-Y0demo9.jpg','http://lc-Y0demo10.jpg'],
    jsonList:[{name:'fish',age:'18'},{name:'fish',age:'18'},{name:'fish',age:'18'}]
    }
    },
    }
    </script>

    <style scoped>
    </style>

  4. v-if 、v-else-if、v-else

    条件指令可以根据后面跟的表达式或boolean值 在dom中是否渲染或销毁元素或组件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <template>
    <div id="wapper">
    <div v-if="isShow">show</div>
    <div v-if="1>0">show2</div>
    <button @click="changeShow()"></button>
    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return {
    isShow:true
    }
    },
    methods:{
    changeShow(){
    this.isShow = false
    }
    }
    }
    </script>

    <style scoped>
    </style>

  5. v-show

    v-show指令与v-if类似,不同的是当v-if不满足时,dom根本不渲染或彻底删除掉元素,而v-show不满足时,元素依然会渲染,只是加上了display:none 的样式,将元素隐藏了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <template>
    <div id="wapper">
    <div v-if="isShow">show</div>
    <div v-show="isShow">show By v-show</div>
    <button @click="changeShow()"></button>
    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return {
    isShow:true
    }
    },
    methods:{
    changeShow(){
    this.isShow = false
    }
    }
    }
    </script>

    <style scoped>
    </style>
  6. v-model

    v-model 实现了数据双向绑定,在元素中使用v-model,其绑定的值会自动赋给元素的value属性,同时,当元素的属性值发生改变时,其绑定的值也会动态随之改变。

    它本质上包含两个操作:

    v-bind 将数据绑定到元素或组件上

    v-on 当元素或组件发生变化时,将绑定的数据重新赋值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <template>
    <div id="wapper">
    <input type="text" v-model="message" />
    {{message}}
    <br>

    <input type="radio" v-model="sex" name="group1" id="man" value="男"/>
    <input type="radio" v-model="sex" name="group1" id="women" value="女"/>
    你选择的是:{{sex}}
    <br>
    <input type="checkbox" id="read" v-model="isRead" />同意协议
    你{{isRead?'同意了':'不同意'}}此协议
    <button :disabled="!isRead" value="">下一步</button>
    <br>

    <input type="checkbox" value="篮球" v-model="hobbies" />篮球
    <input type="checkbox" value="足球" v-model="hobbies" />足球
    <input type="checkbox" value="排球" v-model="hobbies" />排球
    <input type="checkbox" value="棒球" v-model="hobbies" />棒球
    你选择了{{hobbies.length==0?'无':hobbies}}
    </div>
    </template>

    <script>
    export default {
    name: "Home",
    data() {
    return {
    hobbies:[],
    isRead:false,
    sex:'男',
    message:'hello '
    }
    },
    methods:{
    }
    }
    </script>

    <style scoped>
    </style>