Vue全家桶之Vue基础

Posted 前端加油

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue全家桶之Vue基础相关的知识,希望对你有一定的参考价值。

Vue全家桶之Vue基础

1. Vue概述

Vue(读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。

渐进式: 声明式渲染→组件系统→客户端路由→集中式状态管理→项目构建

可以使用其中的一个或者多个

优点:

  • 易用:熟悉html,CSS.javascript知识后,可快速上手Vue
  • 灵活:在一个库和一套完整框架之间自如伸缩
  • 高效:20kB运行大小,超快虚拟DOM

2. Vue的基本使用

2.1 传统开发模式对比

 //原生JS
 <div id="msg"></div>
  <script type="text/javascript">
    var msg = 'Hello World'
    var div = document.querySelector('#msg');
    div.innerHTML = msg
  </script>
//jQuery
<div id="msg"></div>
  <script type="text/javascript" src="js/jquery.js"></script>
  <script type="text/javascript">
    var msg = 'Hello World';
    $('#msg').html(msg);
  </script>

2.2 Vue.js之HelloWorld基本步骤

引入Vue的方法:

1.下载Vue.js,然后在<script type='text/javascript' src='js/vue.js'></script>引入

2.使用CDN方法。 <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"></script>

Vue的基本使用步骤:

​ 1、需要提供标签用于填充数据

​ 2、引入Vue.js库文件

​ 3、可以使用vue的语法做功能了

​ 4、把vue提供的数据填充到标签里面

//1.HelloWorld.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title></title>
</head>

<body>
  <div id="app">
      //插值表达式
    <div>{{num}}</div> 
    <div><button @click='handle'>点击</button></div>
  </div>
 //引入vue
  <script type='text/javascript' src='js/vue.js'></script>
  <script type='text/javascript'>
    var vm = new Vue({
      el: '#app',
      data: {
        num: 0
      },
      methods: {
        handle: function () {
          this.num++;
        }
      }
    });
  </script>
</body>

</html>

在这里插入图片描述

2.3 Vue.js之HelloWorld细节分析

1. 实例参数分析

  • el:元素的挂载位置(值可以是CSS选择器或者DOM元素)关联起来
  • data:模型数据(值是一个对象)
  • methods,该属性用于在Vue对象中定义方法。

2.插值表达式用法

  • 将数据填充到HTML标签中
  • 插值表达式支持基本的计算操作

3. Vue代码运行原理分析

  • 概述编译过程的概念(Vue语法经过Vue框架编译成原生JS语法,才能够被浏览器执行)

在这里插入图片描述

3. Vue 模板语法

3.1 模板语法概述

前端渲染:把数据填充到HTML标签中

在这里插入图片描述

前端渲染方式:

  • 原生js拼接字符串
  • 使用前端模板引擎
  • 使用vue特有的模板语法(推荐)

原生js拼接字符串基本上就是将数据以字符串的方式拼接到HTML标签中。

缺点:不同开发人员的代码风格差别很大,随着业务的复杂,后期的维护变得逐渐困难起来。

使用前端模板引擎是基于模板引擎art-template的一段代码,与拼接字符串相比,代码明显规范了很多,它拥有自己的一套模板语法规则。

优点:大家都遵循同样的规则写代码,代码可读性明显提高了,方便后期的维护。

缺点:没有专门提供事件机制。

插值表达式 {{变量}}

  • 使用’mustache’语法 {{ msg }}(双花括号)
  • mustache 标签将会被替换为 data 对象上对应的 msg 属性的值。
  • 只要绑定的数据对象上的 msg 属性发生改变,插值内容也会随之更新。
   <div id="app">
      <!-- this 指向 vm -->
      <p> {{ msg }} </p>
   </div>
   
   <script>
	var vm = new Vue({
    	el: ‘#app’,
  		data: {
  			msg: 'hello vue.js'
  		}
  	})
	</script>

模板语法概述

  • 插值表达式
  • 指令
  • 事件绑定
  • 属性绑定
  • 样式绑定
  • 分支循环结构

3.2 指令

1.什么是指令?

  • 自定义属性:如在html5中定义,属性均可随意命名。
  • 指令的本质就是自定义属性
  • 指令的格式:以v-开始(比如:v-cloak)

2.v-cloak指令用法

插值表达式存在的问题:“闪动”

如何解决该问题:使用v-cloak指令

 v-cloak指令的用法
  1、提供样式
   属性选择器
    [v-cloak]{
      display: none;
    }
  2、在插值表达式所在的标签中添加v-cloak指令

背后的原理:先通过样式隐藏内容,然后在内存中进行值的替换,替换好之后再显示最终的结果

//02-指令v-cloak的用法.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
  [v-cloak]{
    display: none;
  }
  </style>
</head>
<body>
  <div id="app">
    <div v-cloak>{{msg}}</div>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    var app = new Vue({
      el: '#app',
      data: {
        msg: 'Hello Vue'
      }
    });
  </script>
</body>
</html>

3 .数据绑定指令

  • v-text填充纯文本

    用于将数据填充到标签中,作用于插值表达式类似,但是没有闪动问题

  • v-html填充HTML片段

    用于将HTML片段填充到标签中,但是可能有安全问题

  • v-pre填充原始信息
    显示原始信息,跳过编译过程(分析编译过程)

//03-数据填充相关3个指令用法.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div>{{msg}}</div>
    <div v-text='msg'></div>
    <div v-html='msg1'></div>
    <div v-pre>{{msg}}</div>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'Hello Vue',
        msg1: '<h1>HTML</h1>'
      }
    });
  </script>
</body>
</html>

在这里插入图片描述

4.数据响应式

  • 如何理解响应式

    html5中的响应式(屏幕尺寸的变化导致样式的变化)
    数据的响应式(数据的变化导致页面内容的变化)

  • 数据绑定:将数据填充到标签中,默认是响应式的

  • v-once只编译一次,显示内容之后不再具有响应式功能

    v-once的应用场景:如果显示的信息后续不需要再修改,可以使用v-once提高性能。

//04-指令v-once的用法.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <h2>{{message}}</h2>
    <h2 v-once>{{message}}</h2>
  </div>
  <script>
    const app = new Vue({
      el: "#app",
      data: {
        message: "你好啊"
      }
    })
  </script>
</body>

</html>

在这里插入图片描述

3.3 双向数据绑定

1.什么是双向数据绑定?

在这里插入图片描述

2.双向数据绑定分析

Vue中使用v-model指令来实现标签内容的绑定(双向绑定).如表单元素和数据的双向绑定

v-model只能用于表单类型,就是输入性控件,其他控件不能用,用v-bind

<input type='text' v-model='uname'/>
//05.双向数据绑定.html
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <div>{{msg}}</div>
      <div>
        <input type="text" v-model='msg'>
      </div>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
      /* 双向数据绑定
        1、从页面(用户)到数据
        2、从数据到页面  */
      var vm = new Vue({
        el: '#app',
        data: {
          msg: 'Hello Vue'
        }
      });
    </script>
  </body>
  </html>

在这里插入图片描述

案例解析:

当我们在输入框输入内容时,因为input中的v-model绑定了msg,所以会实时将输入的内容传递给msg,msg发生改变。

当msg发生改变时,因为上面我们使用Mustache语法,将msg的值插入到DOM中,所以DOM会发生响应的改变。

3.MVVM设计思想

M在这里插入图片描述
VVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开

  • View层:视图层

在我们前端开发中,通常就是DOM层。主要的作用是给用户展示各种信息。

  • Model层:数据层

数据可能是我们固定的死数据,更多的是来自我们服务器,从网络上请求下来的数据。

  • VueModel层:视图模型层

视图模型层是View和Model沟通的桥梁。

一方面它通过Data Binding(数据绑定),将Model的改变实时的反应到View中

另一方面它通过DOM Listener(DOM监听),当DOM发生一些事件(点击、滚动、touch等)时,可以监听到,并在需要的情况下改变对应的Data。

3.4 事件绑定

1.Vue如何处理事件?

  • v-on指令用法:用于绑定HTML事件,如鼠标点击事件

  • 当前button绑定鼠标点击事件,点击则调用doSomething方法

    在这里doSomething() 是一个函数,可以写在methods的方法中,供该标签调用.

 <button v-on:click="doSomething">...</button>
  • v-on语法糖(简写形式)@
<input type='button' @click='num++'/>
//06-事件基本用法.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <div>{{num}}</div>
    <div>
        //4种都可以实现
      <button v-on:click='num++'>点击</button>
      <button @click='num++'>点击1</button>
      <button @click='handle'>点击2</button>
      <button @click='handle()'>点击3</button>
    </div>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        num: 0
      },
      methods: {
        handle: function () {
          // 这里的this是Vue的实例对象
          console.log(this === vm)
          // 在函数中 想要使用data里面的数据 一定要加this 
          this.num++;v
        }
      }
    });
  </script>
</body>

</html>

2.事件函数的调用方式

  • 直接绑定函数名称
<button v-on:click='say'>Hello</button>
  • 调用函数
<button v-on:click='say()'>Hello</button>

3.事件函数参数传递

  • 事件函数参数传递
<button v-on:click='say('hi',$event)'>Hello</button>
//07-事件函数传参.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>{{num}}</div>
        <div>
            <!-- 如果事件直接绑定函数名称,那么默认会传递事件对象作为事件函数的第一个参数 -->
            <button v-on:click='handle1'>点击1</button>
            <!-- 2、如果事件绑定函数调用,那么事件对象必须作为最后一个参数显示传递,
                 并且事件对象的名称必须是$event -->
            <button v-on:click='handle2(123, 456, $event)'>点击2</button>
        </div>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: {
                num: 0
            },
            methods: {
                handle1: function(event) {
                    console.log(event.target.innerHTML)
                },
                handle2: function(p, p1, event) {
                    console.log(p, p1)
                    console.log(event.target.innerHTML)
                    this.num++;
                }
            }
        });
    </script>
</body>

</html>

在这里插入图片描述

4.事件修饰符

  • .stop 阻止冒泡
<a v-on:click.stop="handle">跳转</a>
  • .prevent阻止默认行为
<a v-on:click.prevent="handle">跳转</a>
//08-事件修饰符.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <div>{{num}}</div>
    <div @click='handle0'>
      <button @click.stop='handle1'>点击1</button>
    </div>
    <div>
      <a href="http://www.baidu.com" @click.prevent='handle2'>百度</a>
    </div>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        num: 0
      },
      methods: {
        handle0: function () {
          this.num++;
        },
        handle1: function (event) {
          // js阻止冒泡
          // event.stopPropagation();
        },
        handle2: function (event) {
          // js阻止默认行为
          // event.preventDefault();
        }
      }
    });
  </script>
</body>

</html>

未加事件修饰符:

在这里插入图片描述
加事件修饰符:
在这里插入图片描述

5.按键修饰符

  • .enter 回车键
<input v-on:keyup.enter='submit'>
  • .delete删除键
<input v-on:keyup.delete='handle'>
//09-按键修饰符.html
<!DOCTYPE html>
<html lang="en">
<head>
  以上是关于Vue全家桶之Vue基础的主要内容,如果未能解决你的问题,请参考以下文章

Vue全家桶之组件化开发

Vue全家桶之VueX

Vue全家桶之webpack详解

Vue全家桶之Vue组件化开发

Vue全家桶之Vue-router路由

Vue全家桶之VueCLI 脚手架V2→V4版本