【Vue】1.v-指令、computed、watch

1 Vue 实例

        注:此文件是 vue 根实例,data 可以 是一个对象

        即 data:{ }

        但是在其他 .vue 组件文件中,data 必须 是一个函数,返回一个新的对象,以避免多个组件实例之间的数据相互干扰

        data(){ }

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demo</title>

</head>

<body>
    <div id="app">
        {{ message }}
    </div>

    <!-- 引入 Vue.js 库 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                message: 'vue'
            }
        })
    </script>
</body>

</html>

el 属性用于指定 Vue 实例所控制的 DOM 元素

        DOM 是 Document Object Model(文档对象模型)的缩写,它是一种跨平台、与编程语言无关的接口,允许程序和脚本动态地访问和更新文档的内容、结构以及样式。简单来说,DOM 是浏览器将 HTML 或 XML 文档解析为树形结构的表示,每个节点都是文档的一部分,比如元素、属性、文本等

测试

2 插值表达式

通过插值表达式,可以将 Vue 实例中的数据渲染到 DOM 中的元素上

1、

{{ message }}

2、

{{ 2 + 2 }}

3、

{{ new Date().toLocaleDateString() }}

插值表达式可以调用 JavaScript 的日期函数并显示结果,显示当前日期

4、

{{ age>=18? 'adult' : 'youngster }}

字符串转大写

{{ 'hello vue!'.toUpperCase() }}

字符串转小写

{{ 'HELLO VUE!'.toLowerCase() }}

字符串长度

{{ 'Hello Vue!'.length }}

字符串截取

{{ 'Hello Vue!'.slice(0, 5) }}

数组排序

{{ [5, 2, 9, 1].sort() }}

数组链接

{{ [1, 2, 3].join(' - ') }} // 1 - 2 - 3

数字转为货币格式

{{ (1234567.89).toLocaleString('en-US', { style: 'currency', currency: 'USD' }) }}

$1,234,567.89

2.1 Vue的响应式特性

数据变化,视图自动更新

访问数据:

        实例.属性名

如:

vm.message

3 Vue 指令

Vue 指令:带有 v- 前缀的特殊 标签属性

3.1 v-html

将 HTML 内容动态插入到页面中的元素里

与普通的插值表达式不同,v-html 可以解析并渲染 HTML 标签,而不是将它们作为普通文本显示

3.2 v-show 和 v-if

v-show:控制元素显示/隐藏

语法:v-show = "表达式" (true 显示,flase 隐藏)

原理:切换 css 的 display: none 来控制显示隐藏

场景:频繁切换显示隐藏的场景

v-if:控制元素显示/隐藏(条件渲染)

语法:v-if = "表达式" (true 显示,flase 隐藏)

原理:根据 判断条件 控制元素的 创建移除(条件渲染)

场景:要么显示,要么隐藏,不频繁切换的场景

用法一致,以 show 为例:

3.3 v-else 和 v-else-if

3.4 v-on

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

语法:

  1. v-on:事件名 = "内联语句"
  2.  v-on:事件名 = "methods 中的函数名"

简写:@事件名

内联语句:可执行代码,如 count++

<input type="button" v-on:click="count++" value="count++">

等价于:

<input type="button" @click="count++" value="count++">

@后面可以加上 监听事件

1、鼠标事件

@click        点击

@dblclick        双击

@mousedown        按下

@mouseup        松开

@mouseover        移到元素上方

@mouseout        移出元素

2、键盘事件

@keydown        按下

@keyup        松开

@keypress        按下并释放

3、表单事件

@input        输入

@change        输入框、复选框、单选框的值改变

@focus        获得焦点

@blur        失去焦点

@submit        表单提交

methods 方法:

3.5 v-bind

作用:动态设置 html 的 标签属性(src、url、title)

语法:v-bind: 属性名 = "表达式" 

简写:: 属性名 = "表达式" 

 等价于

3.6 v-for

作用:基于数据循环,多次渲染 整个元素

语法:v-for = "(item,index) in 数组"

3.7 v-model

作用:给 表单元素 使用,双向数据绑定

        数据变化->视图自动更新

        视图变化->数据自动更新

语法:v-model = '变量'

4 指令修饰符

        指令修饰符是特殊的后缀,用于增强指令的功能。修饰符以点(.)开头,紧跟在指令名称之后。不同的修饰符提供了不同的功能

        如 v-model.number

4.1 v-model 修饰符

.lazy        只有当输入框失去焦点时才更新数据,而不是每次输入时更新

.number        自动将用户的输入值转换为数值类型

.trim        自动移除用户输入的首尾空格

4.2 v-on 修饰符

.stop        阻止 事件冒泡,等同于调用 event.stopPropagation()

(@click.stop)

        事件冒泡 是一种事件传播机制,当一个事件被触发时,它首先在最具体的元素(事件目标)上触发,然后逐步向上传播到其祖先元素,直到到达最顶层的元素(通常是 document 对象)。在浏览器中,大部分事件都是按照这种冒泡方式进行传播的

定义 父级元素 子级元素,和对应的 点击事件

当点击子级元素时,弹窗两次

当希望只触发子级元素时,

@click.stop="ClickSon()"

弹窗只发生一次

.prevent        阻止默认事件,等同于调用 event.preventDefault()

.capture        以捕获模式监听事件,事件在目标的所有子元素处理前触发

.self        只有事件在绑定的元素本身触发时才执行回调,避免子元素触发

.once        事件只触发一次,之后不会再触发

4.3 v-bind 修饰符

.prop        强制绑定 DOM 属性,而不是 HTML 特性

.sync        创建一个父组件与子组件之间的双向绑定(仅适用于 Vue 2.x)

4.4 键盘事件修饰符

回顾键盘事件:

@keydown        按下

@keyup        松开

@keypress        按下并释放

.enter        监听 enter 键

.tab        监听 tab 

.delete        监听 delete 键

.esc        监听 esc 键

.space        监听空格键

.up.down.left.right        监听方向键

5 v-bind 样式控制

        为了方便开发者进行 样式控制,Vue 扩展了 v-bind 的语法,可以针对 class 类名style 行内样式 进行控制

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

对象

适用场景:一个类名,来回切换

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

 数组

适用场景:批量添加或删除类

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

<head> 标签里面设置 <style>

style 的三种选择器:

1、元素选择器

直接根据 HTML 元素来应用样式,影响页面上所有该元素的样式。

<style>
  p {
    color: blue;
    font-size: 18px;
  }
</style>

2、类选择器

使用 . 来选择具有特定类名的元素。这种方式可以应用于多个元素

<style>
  .highlight {
    background-color: yellow;
    font-weight: bold;
  }
</style>

<body>
  <p class="highlight">这个段落应用了类选择器</p>
</body>

3、ID 选择器

使用 # 来选择具有唯一 ID 的元素。每个页面中的 ID 是唯一的,通常用于唯一元素的样式设置

<style>
  #header {
    color: red;
    font-size: 24px;
  }
</style>

<body>
  <h1 id="header">这个标题应用了 ID 选择器</h1>
</body>

案例

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

<form>
            <label for="student_number">student_number: </label>
            <input type="text" id="student_number" v-model="student.student_number"><br><br>

            <label for="name">name: </label>
            <input type="text" id="name" v-model="student.name" value="name"><br><br>

            <label>gender: </label>

            <input type="radio" v-model="student.gender" id="male" value="male" name="gender">
            <label for="male">male</label>
            <input type="radio" v-model="student.gender" id="female" value="female" name="gender">
            <label for="female">female</label><br><br>


            <input type="checkbox" id="tennis" value="tennis" v-model="student.hobbies">
            <label for="tennis">Tennis</label><br>

            <input type="checkbox" id="run" value="run" v-model="student.hobbies">
            <label for="run">Run</label><br>

            <input type="checkbox" id="sing" value="sing" v-model="student.hobbies">
            <label for="sing">Sing</label><br><br>

            <label for="city">city: </label>
            <select id="city" v-model="student.city" style="width: 100px;">
                <option value="beijing" name="city">beijing</option>
                <option value="herbin" name="city">herbin</option>
                <option value="wuhan" name="city">wuhan</option>
                <option value="qingdao" name="city">qingdao</option>
                <option value="chengdu" name="city">chengdu</option>
            </select><br><br>
            <label>description</label><br>
            <textarea v-model="student.description"></textarea><br><br>

            <input type="submit" value="submit">
        </form>
        <br><br>
        {{ student }}

7 计算属性

7.1 get 读

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

语法:
① 声明在 computed 配置项中,一个计算属性对应一个函数

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

<div>
<table>
            <tr>
                <td>num idx</td>
                <td>val</td>
            </tr>
            <tr v-for="(item,) in nums">
                <td>{{ item.name }}</td>
                <td>{{ item.value }}</td>
            </tr>
</table>
            totalNum: {{ totalNum }}
</div>

<script>
        const vm = new Vue({
            el: '#app',
            data: {
                nums: [
                    { name: 'num1', value: 7 },
                    { name: 'num2', value: 8 },
                    { name: 'num3', value: 9 },
                ]
            },
            computed: {
                totalNum() {
                    let sum = this.nums.reduce((sum, item) => sum + item.value, 0);
                    return sum;
                }
            }
</script>

为什么不用 methods:

7.2 get 读 和 set 写

 

<div id="app">
  <p>First Name: {{ student.firstName }}</p>
  <p>Last Name: {{ student.lastName }}</p>

  <!-- 使用计算属性 -->
  <p>Full Name: {{ fullName }}</p>

  <!-- 通过计算属性更新 fullName -->
  <input type="text" v-model="fullName" placeholder="修改 Full Name">
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
  new Vue({
    el: '#app',
    data() {
      return {
        student: {
          firstName: 'John',
          lastName: 'Doe'
        }
      };
    },
    computed: {
      // 计算属性 fullName,带有 getter 和 setter
      fullName: {
        // 读取 fullName(get)
        get() {
          return this.student.firstName + ' ' + this.student.lastName;
        },
        // 修改 fullName 时,更新 firstName 和 lastName(set)
        set(newValue) {
          const names = newValue.split(' ');
          this.student.firstName = names[0];
          this.student.lastName = names.length > 1 ? names[1] : '';
        }
      }
    }
  });
</script>

8 watch

监听器(监视器)

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

语法:

1、简单写法简单类型数据,直接监视
2、完整写法添加额外配置项

简单写法

watch 要写要监视的 data,后面是方法

注:如果data是对象,则

这里有另一个案例

解决 CORS 跨域资源共享(以百度翻译 API 为例)-CSDN博客

防抖:降低服务器压力

这里obj是对象,正常的watch的写法:

'obj(newValue){}'

但是如果需要监视整个对象,监视对象所有数据 ---> 深度监视

9 购物车案例(to do)

034-水果购物车-基本渲染_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值