从零开始的VUE学习(day1-3)

313 阅读7分钟

一、VUE快速上手

1.vue的定义:

一个用于构建用户界面的渐进式框架

(“构建用户界面”:基于数据渲染出用户看到的页面;“渐进式”指页面搭建是循序渐进的;“框架”指一整套完整的项目解决方案

(常见的Vue的两种使用方式:①核心开发(用于局部模块改造),②核心包&插件的工程化开发(用于整站开发)

2.创建Vue实例的基本步骤

(1)构建用户界面(确定需求)

(2)创建Vue实例进行初始化渲染

①准备容器(在html代码中建div中装需要渲染的数据)

②引包(相当于JS和CSS的链接引用,不过Vue的引用是从其官网的网址引用;同时也要单独放在一个script中)

③创建Vue实例 new Vue() (创建一个空对象,里面放配置项用来渲染数据)

④指定配置项 → 渲染数据

("el"用来指定挂载点,"data"用来提供数据)

<script>
  const app = new Vue({
    el:'#app',
    data:{
      msg:'hello 黑马'
      }
  })
</script>

3.插值表达式

(1)作用

利用表达式进行插值,渲染到页面中(算数表达式,逻辑表达式,变量,对象都可以)

(2)语法:{{表达式}}

(3)注意点

①必须使用存在的数据(意味着我们必须要在data中声明才能插值)

②不支持语句

③不能在标签的属性中进行插值

4.响应性特性

(1)Vue的响应性:数据变化,视图会自动更新

(2)访问/修改数据

①访问:app.msg

②修改:app.msg = 'Hello World'

5.开发者工具

便于测试Vue代码的工具,下载方式详见课程

二、Vue指令

1.初步了解

Vue会根据不同的“指令”,针对标签实现不同的“功能”;“指令”是带有v-前缀的特殊属性标签

2.分类

(1)v-html

设置元素的innerHTML(可以在data中写html代码,通过<div v-html="msg"></div>进行动态解析)

官方的解释是这样的:v-html 的内容直接作为普通 HTML 插入—— Vue 模板语法是不会被解析的。

(2)v-show

①作用:控制元素显示隐藏

②语法:v-show="表达式" (表达式值true显示)

③原理: 控制CSS样式进行显示隐藏

④场景:频繁切换显示隐藏的场景(比如小米商城右上角的小型购物车,导航栏)

(3)v-if

①作用:控制元素显示隐藏(条件渲染)

②语法:v-if="表达式" (表达式值true显示)

③原理: 基于条件判断,是否创建或移除节点(控制DOM来进行显示隐藏)

④场景:不频繁切换显示隐藏的场景(比如未登录就无法显示更多商品的小功能)

(4)v-else/v-elif

①作用:控制元素显示隐藏(辅助v-if进行判断渲染

②语法:v-else v-elif="表达式" (表达式值true显示,前必须要使用v-if)

③原理:基于条件判断,是否创建或移除节点(控制DOM来进行显示隐藏)

④场景:不频繁切换显示隐藏且有多个判断条件分层的场景(比如未登录就无法显示更多商品的小功能)

(5)v-on

①作用:注册事件 = 添加监听 + 提供处理逻辑

②语法

A.v-on:事件名 = "内联语句" (用于比较简单的场景)

<button v-on:click="count++">按钮</button>
//也可使用简化方法
<button @click="count++">按钮</button>

B.v-on:事件名 = "methods中的函数名"

<div id="app">
    <button @click="fn">切换显示隐藏</button>
    <h1 v-show="isShow">黑马程序员</h1>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app4 = new Vue({
      el: '#app',
      data: {
        isShow: true
      },
      methods: {
        fn () {
          // 让提供的所有methods中的函数,this都指向当前实例
          // console.log('执行了fn', app.isShow)
          // console.log(app3 === this)
          //函数中不能直接拿数据,必须要使用访问的方法拿
          this.isShow = !this.isShow
        }
      }
    })
  </script>

③调用传参:更改语法为

<div id="app">
    <button @click="fn(a,b)">切换显示隐藏</button>
    <h1 v-show="isShow">黑马程序员</h1>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app4 = new Vue({
      el: '#app',
      data: {
        isShow: true
      },
      methods: {
        fn (a,b) {
          // 让提供的所有methods中的函数,this都指向当前实例
          // console.log('执行了fn', app.isShow)
          // console.log(app3 === this)
          //函数中不能直接拿数据,必须要使用访问的方法拿
          this.isShow = !this.isShow
        }
      }
    })
  </script>

(6)v-bind

①作用:动态的设置html的标签属性

②语法:v-bind:属性名="表达式" ,也可以缩写成:属性名="表达式"

(7)v-for

①作用:基于数据循环,多次渲染整个元素 → 数组、对象、数字

②语法:

我是内容

③遍历数组语法:<p v-for="(item,index) in 数组" (item每一项,index下标)

④案例

<body>

  <div id="app">
    <h3>小黑的书架</h3>
    <ul>
      <li v-for="(item, index) in booksList" :key="item.id">
        <!-- 利用插值表达式循环出数组每一项的数据 -->
        <span>{{ item.name }}</span>
        <span>{{ item.author }}</span>
        <!-- 注册点击事件 →  通过 id 进行删除数组中的 对应项 -->
        <button @click="del(item.id)">删除</button>
      </li>
    </ul>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        booksList: [
          { id: 1, name: '《红楼梦》', author: '曹雪芹' },
          { id: 2, name: '《西游记》', author: '吴承恩' },
          { id: 3, name: '《水浒传》', author: '施耐庵' },
          { id: 4, name: '《三国演义》', author: '罗贯中' }
        ]
      },
      methods: {
        del(id) {
          // console.log('删除', id)
          // 通过 id 进行删除数组中的 对应项 → filter(不会改变原数组)
          // filter: 根据条件,保留满足条件的对应项,得到一个新数组。
          // console.log(this.booksList.filter(item => item.id !== id))
          this.booksList = this.booksList.filter(item => item.id !== id)
        }
      }
    })
  </script>
</body>

⑤key:给元素添加唯一标识,便于Vue进行列表项的正确排序复用(没有的话会保留需删除那项,把最后一项删掉,然后把文字移上去,蛮抽象的)

⑥key使用的注意点:A.key的值只能是字符串或数字类型 B.key的值必须具有唯一性 C.推荐使用id作为key(因为数组的id不会改变,而index会改变)

(8)v-model

①作用:给表单元素使用,双向数据绑定,从而快速获取或设置表单元素内容

②语法:v-model='变量'

三、指令补充

1.指令修饰符

(1)定义

通过"."指明一些指令后缀,不同后缀封装了不同的处理操作以此来简化代码

(2)分类

①按键修饰符

@keyup.enter → 键盘回车监听

②v-model修饰符

v-model.trim → 去除首尾空格

v-model.number → 数字字符串转数字

③事件修饰符

@事件名.stop → 阻止冒泡

@事件名.prevent → 阻止默认行为

2.v-bind → 操作class

语法: :class="对象/数组"

A.对象 → 键就是类名,值是布尔值。

如果值为true,有这个类,否则没有(适用于一个来回切换的类)

<div class="box" :class="{类名1:布尔值,类名2:布尔值}"></div>

B.数组 → 数组中所有的类,都会被添加到盒子上。

本质是一个class列表(适用于批量添加或删除类)

<div class="box" :class="[类名1,类名2,类名3]"></div>

3.v-model 应用于其他表单元素

(1)说明:常见的表单元素都可以用v-model绑定关联 → 快速获取或设置表单元素的值

(并且会根据控件类型自动选取正确的方法来更新元素)

(2)可以绑定的表单元素举例

①输入框 input:text → value

②文本域 textarea → value

③复选框 input:checkbox → checked

④单选框 input:radio → checked (需要加name进行分组)

<input v-model="gender" type="radio" name="gender" value="1">男

⑤下拉菜单 select → value

四、computed计算属性

1.概念

基于现有的数据,计算出来的新属性。依赖的数据变化,自动重新计算。

2.语法

(1)先在computed配置项中声明,一个计算属性对应一个函数 (函数需要return)

(2)使用起来和普通属性一样使用 {{计算属性名}}

3.computed计算属性与methods方法

(1)computed计算属性

①作用:封装了一段对数据的处理。求得一个结果

②作为属性直接使用 → this.计算属性 {{计算属性名}}

③缓存特性:会对计算出的结果进行缓存,再次使用直接读取缓存,依赖项变化了也会自动重新计算并再次缓存

(2)methods方法

①作用:给实例提供一个方法,调用以处理业务逻辑

②语法:A.写在methods配置项

B.作为方法,需要调用 → this.方法() {{方法名()}} @事件名="方法名"

4.计算属性的完整写法

(1)说明

计算属性默认的简写,只能读取访问,不能修改,要修改必须用完整写法

(2)语法

computed:{
  计算属性名:{
    get(){
      一段计算逻辑
      return 结果
    }
    set(){
      一段计算逻辑(修改的逻辑)
    }
  }
}

五、watch侦听器(监视器)

1.作用:监视数据变化,执行一些业务逻辑或异步操作

2.语法

(1)简单写法 → 简单类型数据,直接监视

data: {
  words: '',
  obj: {
    words: ''
  }
},
      
watch: {
          // 该方法会在数据变化时调用执行
          // newValue新值, oldValue老值(一般不用)
          //需要和data中同名,子属性用'aaa.bbb'
   words (newValue) {
        console.log('变化了', newValue)
   },
   'obj.words' (newValue) {
        console.log('变化了', newValue)
     }
}

(2)完整写法 → 添加额外配置项

①deep:true 对复杂类型深度监视

②immediate:true 初始化立刻执行一次handler方法

data: {
  words: '',
  obj: {
    words: ''
  }
},
      
watch: {
   数据属性名:{
     deep:true,
     handler (newValue) {
       console.log(newValue)
     }
   }
}