vue基础入门

412 阅读7分钟

vue基础入门

vue简介

什么是vue

概念: 是一套用于构建用户界面的前端框架

image.png

vue特性

vue框架的特性,主要体现在如下两方面:

  1. 数据驱动视图 在使用了vue的页面中,vue会监听数据的变化,从而自动重新渲染页面的结构。

image.png

好处:当页面数据发生变化时,页面会自动重新渲染

注意:数据驱动视图是单向的数据绑定

  1. 双向数据绑定

在填写表单时,双向数据绑定可以辅助开发者在不操作dom的前提下,自动把用户填写的内容同步到数据源中,示意图如下:

image.png

MVVM

MVVM是vue实现数据驱动视图和双向数据绑定的核心原理。MVVM指的是Model,View和ViewModel,他把每个HTML页面都拆分成了这三个部分,如图所示:

在MVVM概念中:

  • Model表示当前页面渲染时所依赖的数据源
  • view表示当前页面所渲染的DOM结构
  • ViewModel表示vue的实例,它是MVVM的核心

MVVM的工作原理

ViewModel作为MVVM的核心,是他把当前页面的数据源和页面结构连接在了一起

image.png

当数据源发生变化时,会被ViewModel监听到,VM会根据最新的数据源自动化更新页面结构

当表单元素的值发生变化时,也会被VM监听到,VM会把变化过后的最新的值自动同步到Model数据源中

image.png

vue的基本使用

基本使用步骤

  1. 导入vue.js的script脚本文件
  2. 在页面中声明一个将要被vue所控制的DOM区域
  3. 创建VM实例对象(vue实例对象)
  <!-- 希望vue能够控制下面的这个div,帮我们再把数据填充到div内部 -->
    <div id="app">{{username}}</div>
<!-- 导入vue库文件,在windows全局就有了vue这个构造函数 -->
    <script src="./lib/vue-2.6.12.js"></script>
<!-- 2.创建vue的实例对象 -->
<script>
    //创建vue的实例对象
        const vm= new Vue({
            //el属性是固定的语法,表示当前vm示例要控制页面上的哪个区域,接收的值是一个选择器
            el:'#app',
            //data对象就是要渲染到页面上的数据
            data:{
                username:'zhangsan'
            }
        })


</script>

基本代码与MVVM的对应关系

image.png

vue调试工具

安装vue-devtools调试工具

vue官方提供的vue-devtools调试工具,能够方便开发者对vue项目进行调试与开发

vue的指令

指令的概念

指令是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。

vue中的指令按照不同的用途可以分为以下6大类:

  1. 内容渲染指令
  2. 属性绑定指令
  3. 事件绑定指令
  4. 双向绑定指令
  5. 条件渲染指令
  6. 列表渲染指令

注意:指令是vue开发中最基础,最常用,最简单的知识点

  • 内容渲染指令

内容渲染指令用来辅助开发者渲染DOM元素的文本内容

  • v-text(不常用)

用法示例:

image.png

v-text指令会覆盖元素内默认的值

  • {{}}

插值表达式语法: vue提供的{{}}语法,专门用来解决v-text会覆盖默认文本内容的问题(英文名:Mustache)

注意:相对于v-text指令来说,插值表达式在开发中更常用一些,因为它不会覆盖元素中的默认文本内容

  • v-html v-text指令和插值表达式只能渲染纯文本内容。如果要把包含html标签的字符串渲染为页面的html元素,则需要用到v-html这个指令

image.png

  • 属性绑定指令

如果需要为元素的属性绑定属性值,则需要用v-bind属性绑定指令,用法示例如下:

image.png

由于v-bind指令在开发中使用的频率非常高,因此,vue官方为其提供了简写形式(简写为英文的冒号:)

使用JavaScript表达式

在vue提供的模板渲染语法中,除了支持绑定简单的数据值之外,还支持JavaScript表达式的运算,例如:

image.png

  • 事件绑定指令

vue提供了v-on事件绑定指令,用来辅助程序员为DOM元素绑定事件监听。语法格式如下:

image.png

通过v-on绑定的事件处理函数,需要在methods节点中进行声明

<script>
    //创建vue的实例对象
        const vm= new Vue({
            //el属性是固定的语法,表示当前vm示例要控制页面上的哪个区域,接收的值是一个选择器
            el:'#app',
            //data对象就是要渲染到页面上的数据
            data:{
                count:3
            },
            //methods的作用就是定义事件处理函数
            methods:{
                add (n){
                    console.log('ok')
                    this.count +=n
                },
                sub(n){
                    console.log('')
                    this.count -=n
                }
            }
        })

事件绑定的简写形式

由于v-on指令在开发中使用频率非常的高,因此,vue官方为其提供了简写形式(简写为英文的@)

image.png

事件参数对象

在原生的DOM事件绑定中,可以在事件处理函数的形参中,接受时间参数对象event。同理,在v-on指令(简写@)所绑定的事件处理函数中,同样可以接收到事件参数对象event,示例代码如下:

image.png

如果绑定事件函数时并没有传参,那么methods中定义的事件处理函数可以直接接收一个参数e,这个参数就是事件参数对象event

绑定事件并传参

在使用v-on指令绑定事件时,可以使用()进行传参

    <div id="app">
        <p>count 的值是:{{count}}</p>
        <button v-on:click="add(3)">+1</button>  <!-- add是事件处理函数定义在data中的methods属性中 -->
        <button @click="sub(2)">-1</button>   <!-- 绑定的时候可以加()小括号用来传参 -->
        <!-- v-on:  可以简写成@ 和属性绑定一样可以使用:简写 -->
    </div>
<!-- 导入vue库文件,在windows全局就有了vue这个构造函数 -->
    <script src="./lib/vue-2.6.12.js"></script>
<!-- 2.创建vue的实例对象 -->
<script>
    //创建vue的实例对象
        const vm= new Vue({
            //el属性是固定的语法,表示当前vm示例要控制页面上的哪个区域,接收的值是一个选择器
            el:'#app',
            //data对象就是要渲染到页面上的数据
            data:{
                count:3
            },
            //methods的作用就是定义事件处理函数
            methods:{
                add (n){
                    console.log('ok')
                    this.count +=n
                },
                sub(n){
                    console.log('')
                    this.count -=n
                }
            }
        })


</script>

$event

eventvue提供的特殊变量,用来表示原生的事件参数对象evevt.event是vue提供的特殊变量,用来表示原生的事件参数对象evevt.event可以解决事件参数event被覆盖的问题

   <!-- 希望vue能够控制下面的这个div,帮我们再把数据填充到div内部 -->
    <div id="app">
        <p >count 的值为{{count}}</p>
        <button @click="add(1,$event)">+1</button>

    </div>
<!-- 导入vue库文件,在windows全局就有了vue这个构造函数 -->
    <script src="./lib/vue-2.6.12.js"></script>
<!-- 2.创建vue的实例对象 -->
<script>
    //创建vue的实例对象
        const vm= new Vue({
            //el属性是固定的语法,表示当前vm示例要控制页面上的哪个区域,接收的值是一个选择器
            el:'#app',
            //data对象就是要渲染到页面上的数据
            data:{
                count:3
            },
            methods:{
                add(n,e){
                    this.count += n
                    console.log(e)
                }
            }
        })

事件修饰符

在事件处理函数中调用event.preventDefault()或event.stopPropagation()是非常常见的需求,因此vue提供了时间修饰符的概念,来辅助程序员更方便的对事件的触发进行控制。常用的五个事件修饰符如下:

image.png

按键修饰符

在监听键盘事件时,我们经常需要判断详细的按键,此时,可以为键盘相关的事件添加按键修饰符,例如:

image.png

  • 双向绑定指令

vue提供了v-model双向数据绑定指令,用来辅助开发者在不操作dom的前提下,快速获取表单的数据

   
    <div id="app">
        <form action="" v-model="username"></form>
    </div>
    <script src="./lib/vue-2.6.12.js"></script>
<script>
        const vm= new Vue({
            el:'#app',
         data:{
                username:'zhangsan'
            }
        })

</script>

v-model指令的修饰符

为了方便对用户输入的内容进行处理,vue为v-model指令提供了3个修饰符,分别是:

image.png

  • 条件渲染指令

条件渲染指令用来辅助开发者按需控制dom的显示与隐藏,条件渲染指令有如下两个,分别是:

  • v-if
  • v-show

示例用法如下:

image.png

v-if和v-show的区别

实现原理不同:

  • v-if指令会动态的创建或移除DOM元素,从而控制元素在页面上的现实与隐藏
  • v-show指令会动态为元素添加或移除style="display:none;"样式,从而控制元素的显示或隐藏

性能消耗不同: v-if有更高的切换开销,而v-show有更高的初始渲染开销,因此:

  • 如果需要非常频繁的切换,则使用v-show较好
  • 如果在运行时条件很少改变,则使用v-if较好

v-else

v-if可以单独使用,或配合v-else指令一起使用:

image.png

注意:v-else必须配合v-if指令一起使用,否则他将不会被识别

v-else-if

v-else-if指令,顾名思义,冲到v-if的“else-if块”,可以连续使用:

image.png

  • 列表渲染指令

vue提供了v-for列表渲染指令,用来辅助开发者基于一个数组来循环来渲染一个列表结构。v-for指令需要使用item in items 形式的特殊语法,其中:

  • items 是待循环的数组
  • item 是被循环的每一项

image.png

v-for指令还支持一个可选的第二个参数,即当前项的索引,其语法格式为(item,index)in items,示例代码如下:

image.png

item项和index索引都是形参,可以根据需要进行重命名

使用key维护列表的状态

当列表的数据变化时,默认情况下,vue会尽可能的复用已经存在的DOM元素,从而提升渲染的性能。但这种默认的性能优化策略,会导致有状态的列表无法被正确更新。

为了给vue一个提示,以便他能跟踪每个节点的身份,从而在保证有状态的列表被正确更新的前提下,提升渲染的性能。此时,需要为每项提供一个唯一的key属性:

image.png

key的主意事项

  1. key的值只能是字符串或者数字类型
  2. key的值必须具有唯一性(不能重复)
  3. 建议把数据项id属性的值作为key的值
  4. 使用index的值当作key的值没有任何意义(因为index的值不具有唯一性)
  5. 建议使用v-for指令时一定要指定key的值(既能提升性能,又能防止列表紊乱)

过滤器

过滤器(Filters)是vue为开发者提供的功能,常用于文本的格式化,过滤器可以用在两个地方:

  • 插值表达式
  • v-bind属性绑定

过滤器应该被添加在JavaScript表达式的尾部,由管道符进行调用,示例代码如下:

image.png

定义过滤器

在创建vue实例期间,可以在filter节点中定义过滤器,示例代码如下:

image.png

私有过滤器和全局过滤器

在filters节点下定义的过滤器,称为“私有过滤器”,因为它只能在当前vm实例所控制的el区域内使用。如果希望在多个vue实例之间共享过滤器,则可以按照如下的格式定义全局过滤器:

image.png

连续调用多个多滤器

过滤器可以串联的进行调用,例如:

image.png

过滤器传参

过滤器本质是JavaScript函数,因此可以接受参数:

image.png

image.png

过滤器仅在vue2和vue1中受支持,在vue3版本中剔除了过滤器相关的功能

品牌列表案例

案例效果及具体实现步骤

  • 案例效果:

image.png

  • 整体实现步骤
  1. 创建基本的vue实例
  2. 基于vue渲染表格数据
  3. 实现添加品牌的功能
  4. 实现删除品牌的功能
  5. 实现修改品牌状态的功能
  • 实现代码:
 <script src="./lib/vue-2.6.12.js"></script>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        // 用户输入的品牌名称
        brand: '',
        // nextId 是下一个,可用的 id
        nextId: 4,
        // 品牌的列表数据
        list: [
          { id: 1, name: '宝马', status: true, time: new Date() },
          { id: 2, name: '奔驰', status: false, time: new Date() },
          { id: 3, name: '奥迪', status: true, time: new Date() },
        ],
      },
      methods: {
        // 点击链接,删除对应的品牌信息
        remove(id) {
          this.list = this.list.filter(item => item.id !== id)
        },
        // 阻止表单的默认提交行为之后,触发 add 方法
        add() {
          // 如果判断到 brand 的值为空字符串,则 return 出去
          if (this.brand === '') return alert('必须填写品牌名称!')

          // 如果没有被 return 出去,应该执行添加的逻辑
          // 1. 先把要添加的品牌对象,整理出来
          const obj = {
            id: this.nextId,
            name: this.brand,
            status: true,
            time: new Date()
          }
          // 2. 往 this.list 数组中 push 步骤 1 中得到的对象
          this.list.push(obj)
          // 3. 清空 this.brand;让 this.nextId 自增 +1
          this.brand = ''
          this.nextId++
        }
      },
    })
  </script>

image.png