认识vue

  • 渐进式框架,什么是渐进式呢?
    • 渐进式意味着可以将vue作为应用的一部分嵌入原本的项目中,带来更丰富的交互体验
    • 或者如果希望更多的业务逻辑使用vue实现,vue就可以使用其核心库以及其生态系统;
    • 如core+vue+router+vuex
  • vue的特点和web开发中常见的高级功能

    • 解耦视图和数据
    • 可复用的组件
    • 前端路由技术
    • 状态管理
    • 虚拟DOM

      安装

  • CDN引入

  • 下载和引入
  • npm安装

    初体验

    1. <body>
    2. <div id="app">{{ message }}</div>
    3. <div>{{ message }}</div>
    4. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    5. <script>
    6. // 这种方式又叫做:声明式编程
    7. const app = new Vue({
    8. el: '#app', // 用于挂载要管理的元素
    9. data: { // 定义数据,这里数据发生改变,页面会同步改变
    10. message: 'hello Vue'
    11. },
    12. })
    13. // 原生js的做法(也叫命令式编程)
    14. // 1、创建div元素,设置id属性
    15. // 2、定义一个变量叫message,并给其赋值
    16. // 3、获取该div对应的DOM对象,设置其innerText/innerHtml来显示
    17. // 4、如果要修改message数据。则需要重新设置DOM元素的innerText来改变数据
    18. </script>
    19. </body>
  • 代码做了什么事情?

    • 首先,创建了一个Vue对象
    • 传入了一些options{ el, data, …. }
    • 其中el表示:这个Vue对象挂载到哪一个元素上,这里挂载到了id为app的元素上
    • 其中的data表示:我们要使用的一些数据,这些数据可以是我们直接定义出来的,也可以是从服务器上获取的
  • 浏览器执行代码的过程
    • 首先解析原来的HTML代码,这时其内部还是显示的{{ message }},而不是’hello Vue’
    • 执行到Vue实例时,就会返回上面去解析{{ }}中的内容

      列表渲染案例

      1. <body>
      2. <div id="app">
      3. <ul>
      4. <li v-for="item in movies">{{item}}</li>
      5. </ul>
      6. </div>
      7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      8. <script>
      9. const app = new Vue({
      10. el: '#app',
      11. data: {
      12. message: 'hello',
      13. movies: ['阿甘正传','星际穿越','大话西游','少年派','盗梦空间']
      14. }
      15. })
      16. </script>
      17. </body>

计数器案例

  1. <body>
  2. <div id="app">
  3. <h2>当前计数:{{counter}}</h2>
  4. <button v-on:click="increase">+</button>
  5. <button v-on:click="decrease">-</button>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  8. <script>
  9. const app = new Vue({
  10. el: '#app',
  11. data: {
  12. counter: 0,
  13. },
  14. methods: {
  15. increase: function() {
  16. this.counter++
  17. },
  18. decrease: function() {
  19. this.counter--
  20. }
  21. }
  22. })
  23. </script>
  24. </body>
  • 这里的methods属性用于在Vue对象中定义方法
  • 这里的v-on:click 也可以写做 @click 可以用来监听某个元素的点击事件,并且当点击事件发生时,执行相应的方法,该方法通常是methods中定义的方法

    Vue中的MVVM

  • 它是 Model-View-ViewModel 的简称,它由View,ViewModel,Model三部分组成。View层代表的是视图、模版,负责将数据模型转化为UI展现出来。Model层代表的是模型、数据,可以在Model层中定义数据修改和操作的业务逻辑。ViewModel层连接Model和View。

  • 在MVVM的架构下,View层和Model层并没有直接联系,而是通过ViewModel层进行交互。ViewModel层通过双向数据绑定将View层和Model层连接了起来,使得View层和Model层的同步工作完全是自动的。因此开发者只需关注业务逻辑,无需手动操作DOM,复杂的数据状态维护交给MVVM统一来管理。
  • View层

    1. <template>
    2. <div id="app">
    3. <div>
    4. <input type="text" v-model="title">
    5. <button @click="add">submit</button>
    6. </div>
    7. <ul>
    8. <li v-for="item in list" :key="item">{{item}}</li>
    9. </ul>
    10. </div>
    11. </template>
  • Model层

    1. <script>
    2. let date = {
    3. title: '',
    4. list: []
    5. }
    6. </script>
  • ViewModel层

    1. <script>
    2. let vm = new Vue({
    3. el: '#app',
    4. data: data,
    5. methods: {
    6. add: function() {
    7. this.list.push(this.title)
    8. this.title = ''
    9. }
    10. }
    11. })
    12. </script>

    Vue实例传入的options

  • 传入的这个对象中可以包含哪些属性呢?

  • 最基础的三个:el,data,methods

Vue的生命周期

  • 生命周期:事物从诞生到消亡的整个过程
  • 我们在new Vue( { } ) 时,Vue内部都会做很多的事情,而生命周期就是把整个的过程划分为不同的阶段
  • 每个阶段都有一个特定的函数,用于在该阶段添加一些相关的操作(create, mounted等)
  • 比如常用的当组件加载完成后,调用created函数,用于请求一些数据,然后将数据放进data中,再展示到页面上
  • 生命周期函数也叫钩子函数(Hook),我的理解:把整个Vue实例的过程比作一个绳子的话,我们就是在特定的节点将其勾过来进行一些操作

lifecycle.png

Vue的template

Vue插值

  • 如何将Vue中的在DOM中显示
  • mustache {{ }} 翻译为胡须,双大括号很像胡须 0.0
  • mustache语法中不仅可以直接写变量,也可以写简单的表达式,如 {{ firstname + lastname }}
  • {{ firstname + ‘ ‘ + lastname }},也可以加空格
  • {{ counter * 2 }} 数字乘以2

v-once指令

  • 适用于:只渲染一次的元素,不会随着数据的改变而发生改变

    1. <div id="app">
    2. <h2>{{message}}</h2>
    3. <h2 v-once>{{message}}</h2>
    4. </div>
    5. <script>
    6. const vm = new Vue({
    7. el: '#app',
    8. data: {
    9. message: '你好呀'
    10. }
    11. })
    12. </script>
  • 此时如果在浏览器的控制台中修改 app.message = ‘哈哈哈’ ,第一行会发生改变,而第二行不会发生变化;

v-html指令

  • 适用于:要展示的数据中有一些html标签时

    1. <div id="app">
    2. <h2>{{url}}</h2> <!--<a href="www.baidu.com">百度一下</a>-->
    3. <h2 v-html="url"></h2> <!--百度一下-->
    4. </div>
    5. <script>
    6. const vm = new Vue({
    7. el: '#app',
    8. data: {
    9. message: 'hello',
    10. url: '<a href="www.baidu.com">百度一下</a>'
    11. }
    12. })
    13. </script>
  • 有时候我们请求回来的数据是标签形式的,如上所示,如果我们直接渲染,就会在页面上显示百度一下这种字符串形式,但是我们想让其显示为a标签的形式,这时就要使用v-html指令

  • v-html指令可以让其后面的以html的形式展示

v-text指令

  • 与模板语法效果相同,但是不够灵活,不常用,而且他会覆盖原本{{ }}中的内容

    1. <div id="app">
    2. <h2>{{message}}</h2> <!--你好呀-->
    3. <h2 v-text="message"></h2> <!--你好呀-->
    4. </div>
    5. <script>
    6. const vm = new Vue({
    7. el: '#app',
    8. data: {
    9. message: '你好呀'
    10. }
    11. })
    12. </script>

    v-pre指令

  • 适用于:不想让标签中的内容被解析,原封不动的展示到页面上的情况

    1. <div id="app">
    2. <h2>{{message}}</h2> <!--你好呀-->
    3. <h2 v-pre>{{message}}</h2> <!--{{massge}}-->
    4. </div>
    5. <script>
    6. const vm = new Vue({
    7. el: '#app',
    8. data: {
    9. message: '你好呀'
    10. }
    11. })
    12. </script>

v-cloak指令

  • 适用于:页面上js延迟加载(或者卡住)时,不想让未被渲染的数据展示出来,用v-cloak来进行隐藏,等js加载完成后再展示渲染后的效果 ```html
    {{message}}

```

  • 它的原理就是,在Vue实例没被加载时,给带有v-cloak的元素加一个样式display:none;让其隐藏,等到Vue实例加载完成,再删除这个属性。