Vue 3.0 基础入门(指令)

本文详细介绍了Vue的单向数据绑定原理,展示了如何使用v-model实现双向数据绑定,以及MVVM架构在表单操作中的应用。还涵盖了指令如v-if、v-for和事件绑定的使用,以及性能优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Vue简介

数据驱动视图:

  • 在使用了 vue 的页面中,vue 会监听数据的变化,从而自动重新渲染页面的结构。
  • 注意:数据驱动视图是单向的数据绑定。

双向数据绑定:

  • 在填写表单时,双向数据绑定可以辅助开发者在不操作 DOM 的前提下,自动把用户填写的内容同步到数据源。
  • 开发者不再需要手动操作 DOM 元素,来获取表单元素最新的值。

MVVM

MVVM 是 vue 实现数据驱动视图和双向数据绑定的核心原理。它把每个 HTML 页面都拆分成了如下三个部分:

  • View 表示当前页面所渲染的 DOM 结构。
  • Model 表示当前页面渲染时所依赖的数据源。
  • ViewModel 表示 vue 的实例,它是 MVVM 的核心,把当前页面的数据源(Model)和页面的结构(View)连接在了一起。

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

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

二、Vue 的基本使用

基本使用步骤

  • 导入 vue.js 的 script 脚本文件
  • 在页面中声明一个将要被 vue 所控制的 DOM 区域
  • 创建 vm 实例对象(vue 实例对象)
<body>
    <!--2. 在页面中声明一个将要被vue所控制的dom区域-->
    <div id = "app">{{username}}</div>
    <!--1. 导入vue.js的scripti脚本文件-->
    <script src="./lib/vue-2.6.12.js"></script>
    <script>
        //3. 创建vm实例对象(vue实例对象)
        const vm = new Vue({
            //3.1指定当前vm实例要控制页面的那个区域
            el:'#app',
            //3.2指定model数据源
            data:{
                username:'zs'
            }
        })
    </script>
</body>

三、Vue 指令

1. 内容渲染指令

渲染 DOM 元素的文本内容:

  • v-text
  • {{ }}
  • v-html

v-text

会把gender对应的值渲染到p标签上,并覆盖默认的文本。

<p v-text="gender">性别</p>

{{ }}语法

插入,不会覆盖默认文本。

<p>性别:{{gender}}</p>

v-html

可以渲染出html标签

<p v-html="des"></p>

/*
    data:{
        des:'<i>abc</i>'
    }
*/

2. 属性绑定指令

<!--使用v-bind指令为input的placeholder动态绑定属性值-->
<input type = "text" v-bind:placehoder="inputValue">
<!--使用v-bind指令为img的src动态绑定属性值-->
<img v-bind:src="imgSrc" alt = "">

使用js表达式

<p>{{message.split('').reverse().join('')}}</p>

3. 事件绑定指令

v-on 事件绑定

原生 DOM 对象有 onclick、oninput、onkeyup 等原生事件,替换为 vue 的事件绑定形式后,

分别为:v-on:click、v-on:input、v-on:keyup

<h3>{{count}}</h3>
<button v-on:click="addCount">+1</button>
<!--简写形式-->
<button @click="count += 1">+1</button>

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

// 创建 VM 实例对象
      const vm = new Vue({
        // 指定当前 VM 要控制的区域
        el: '#app',
        // 数据源
        data: {
          // 计数器的值
          count: 0,
        },
        methods: {
          // 点击按钮,让 count 自增 +1
          addCount() {
            this.count += 1
          },
        },
      })

可以接收到事件对象 event

<h3>count 的值为:{{count}}</h3>
<button v-on:click="addCount">+1</button>

methods: {
    addCount(e) {    //接受事件参数对象event,简写为e:就是被点的那个按钮
        const nowBgColor = e.target.style.backgroundColor
        e.target.style.backgroundColor = nowBgColor === 'red' ? '' : 'red'
        this.count += 1
    },
},

绑定事件并传参

  • 在使用 v-on 指令绑定事件时,可以使用 ( ) 进行传参
  • $event 是 vue 提供的特殊变量,用来表示原生的事件参数对象 event。$event 可以解决事件参数对象 event 被覆盖的问题。
<h3>count 的值为:{{count}}</h3>
<button @click="addCount(2, $event)">+2</button>

methods: {
    //在形参处用step接受传递过来的参数值
    //在形参处用e接受传递过来的原生事件参数对象
    addCount(step, e) {
        const bgColor = e.target.style.backgroundColor
        e.target.style.backgroundColor = bgColor === 'red' ? '' : 'red'
        this.count += step
    },
}

事件修饰符

对事件的触发进行控制

事件修饰符说明
.prevent阻止默认行为
.stop阻止事件冒泡
.capture以捕获模式触发当前的事件处理函数
.once绑定的事件只触发一次
.self只有在event.target是当前元素自身时触发事件处理函数
<div class="outer" @click="onOuterClick">
    外层的 div
    <div class="inner" @click.stop="onInnerClick">内部的 div</div>
</div>

按键修饰符

<!--只有在'key'是'enter'时调用'vm.submit()' -->
<!--只有在'key'是'esc'时调用'vm.clearInput()' -->
<input type="text" @keyup.enter="submit" @keyup.esc="clearInput" />

双向绑定指令

 v-model 双向数据绑定指令,实现对表单的实时同步修改。

注意:v-model 指令只能配合表单元素一起使用!

<p>用户名是:{{username}}</p>
<input type="text" v-model="username" />

<p>选中的省份是:{{province}}</p>
<select v-model="province">
<option value="">请选择</option>
<option value="1">北京</option>
<option value="2">河北</option>
<option value="3">黑龙江</option>
</select>
修饰符作用示例
.lazy

在“change”时而非“input”时更新,当文本框失去焦点时更新

<input v-model.lazy="msg" />

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

<input v-model.number="age" />

.trim去掉用户输入的首位空格

<input v-model.trim="msg" />

条件渲染指令

实现原理不同:

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

性能消耗不同:

  • v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。 
  • 如果需要非常频繁地切换,则使用 v-show 较好
  • 如果在运行时条件很少改变,则使用 v-if 较好

v-else

<div v-if="Math.random() > 0.5">
    随机数大于0.5
</div>
<div v-else>
    随机数小于0.5
</div>

v-else-if

<div v-if="type === 'A'">优秀</div>
<div v-else-if="type === 'B'">良好</div>
<div v-else-if="type === 'C'">一般</div>
<div v-else>其他</div>

v-for

data: {
  // 用户列表的数据
  list: [
    { id: 1, name: 'zs' },
    { id: 2, name: 'ls' },
  ],
},

<ul>
  <li v-for="(index, item) in list">索引是:{{index}},姓名是:{{item.name}}</li>
</ul>

当列表的数据变化时,vue 会尽可能的复用已存在的 DOM 元素,从而提升渲染的性能。为了保证有状态的列表被正确更新的前提下,提升渲染的性能。需要为每项提供一个唯一的 key 属性:

① key 的值只能是字符串或数字类型

② key 的值不能重复

③ 建议把数据项 id 属性的值作为 key 的值(因为 id 属性的值具有唯一性)

④ 使用 index 的值当作 key 的值没有任何意义(因为 index 的值不具有唯一性)

⑤ 建议使用 v-for 指令时一定要指定 key 的值(既提升性能、又防止列表状态紊乱)

<ul>
   <li v-for="(user, index) in userlist" :key="user.id">
   <input type="checkbox" />姓名:{{user.name}}
   </li>
</ul>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值