Vue基础-vue指令

本文详细介绍了Vue.js的基础知识,包括插值表达式、MVVM设计模式,以及v-bind、v-on、v-model等核心指令的用法。通过实例展示了如何使用这些指令实现动态内容渲染、事件绑定、数据双向绑定等功能。还探讨了虚拟DOM和diff算法在提高性能上的作用,强调了key属性在列表渲染中的重要性。
摘要由CSDN通过智能技术生成

一、vue基础-插值表达式

1、思考

1、以前改变标签内容,如何做?
2、用 Vue 有没有更简单的方式?

2、目的

在dom标签中, 直接插入内容

3、语法

又叫: 声明式渲染/文本插值

语法: { { 表达式 }}

<template>
  <div>
    <h1>{
  { msg }}</h1>
    <h2>{
  { obj.name }}</h2>
    <h3>{
  { obj.age > 18 ? '成年' : '未成年' }}</h3>
  </div>
</template>

<script>
export default {
  data() { // 格式固定, 定义vue数据之处
    return {  // key相当于变量名
      msg: "hello, vue",
      obj: {
        name: "小vue",
        age: 5
      }
    }
  }
}
</script>

<style>
</style>

4、总结

什么是插值表达式

双大括号,可以把 vue 数据变量显示在标签内

Vue 中变量声明在哪里

data 函数返回的对象上,用 key 属性声明


二、vue基础-MVVM设计模式

1、思考

在上个代码基础上,在 devtool 工具改变 M 层的变量,观察 V 层(视图的自动同步)

为什么数据改变页面自动更新了?

2、目的

转变思维,用数据驱动视图改变,操作dom的事, vue源码内干了

3、设计模式

是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

  • MVVM,一种软件架构模式,决定了写代码的思想和层次
    • M:   model数据模型          (data里定义)
    • V:    view视图                   (html页面)
    • VM: ViewModel视图模型  (vue.js源码)

  • MVVM通过数据双向绑定让数据自动地双向同步  不再需要操作DOM
    • V(修改视图) -> M(数据自动同步)
    • M(修改数据) -> V(视图自动同步

3.1. 在vue中,不推荐直接手动操作DOM!!!

2. 在vue中,通过数据驱动视图,不要在想着怎么操作DOM,而是想着如何操作数据!!(思想转变)

4、总结

vue源码内采用MVVM设计模式思想, 大大减少了DOM操作, 挺高开发效率

1、什么是设计模式

设计模式适度代码分层,引入一种架构的概念

2、MVVM 是什么?

MVVM(模型、视图、视图模型双向关联的一种设计模式)

3、MVVM 的好处?

减少 DOM 操作,提高开发效率


三、vue指令-v-bind

1、思考

以前给 a 标签设置 href 如何做呢?

2、目标

给标签属性设置vue变量的值

3、语法

插值表达式不能用在html的属性上,如果想要动态的设置html元素的属性,需要使用v-bind指令

vue指令, 实质上就是特殊的 html 标签属性, 特点:  v- 开头

每个指令, 都有独立的作用

  • 语法:v-bind:属性名="vue变量"
  • 简写::属性名="vue变量"
  • <!-- vue指令-v-bind属性动态赋值 -->
    <a v-bind:href="url">我是a标签</a>
    <img :src="imgSrc">

4、总结

把vue变量的值, 赋予给dom属性上, 影响标签显示效果

如何给 dom 标签的属性,设置 Vue 数据变量?

:属性名="vue 数据变量"


四、vue指令-v-on

1、思考

以前如何给按钮绑定点击事件呢?

2、目标

给标签绑定事件

3、语法

    • v-on:事件名="要执行的少量代码"
    • v-on:事件名="methods中的函数"
    • v-on:事件名="methods中的函数(实参)"
  • 简写: @事件名="methods中的函数"
<!-- vue指令:   v-on事件绑定-->
<p>你要买商品的数量: {
  {count}}</p>
<button v-on:click="count = count + 1">增加1</button>
<button v-on:click="addFn">增加1个</button>
<button v-on:click="addCountFn(5)">一次加5件</button>

<button @click="subFn">减少</button>

<script>
    export default {
        // ...其他省略
        methods: {
            addFn(){ // this代表export default后面的组件对象(下属有data里return出来的属性)
                this.count++
            },
            addCountFn(num){
                this.count += num
            },
            subFn(){
                this.count--
            }
        }
    }
</script>

4、小结

1、如何给 dom 标签绑定事件?

@事件名=“methods 里的函数名”

2、如何给事件传值呢?

@事件名=“methods 里的函数名(实参)”


五、vue指令-v-on事件对象

1、思考

1、js 原生如何阻止标签的默认行为?
2、vue 事件处理函数如何获取事件对象呢?

2、目标

vue事件处理函数中, 拿到事件对象

3、语法

无传参, 通过形参直接接收

传参, 通过$event指代事件对象传给事件处理函数

<template>
  <div>
    <a @click="one" href="http://www.baidu.com">阻止百度</a>
    <hr>
    <a @click="two(10, $event)" href="http://www.baidu.com">阻止去百度</a>
  </div>
</template>

<script>
export default {
  methods: {
    one(e){
      e.preventDefault()
    },
    two(num, e){
      e.preventDefault()
    }
  }
}
</script>

4、小结

Vue 事件处理函数,如何拿到事件对象呢?

1、无传参,直接在形参接收
2、有传参,手动传入$event 对象


六、vue指令-v-on修饰符

1、思考

1、e.preventDefault()单词很长不好写吧?
2、有没有一种更简单的方式实现呢?

2、目标

在事件后面.修饰符名 - 给事件带来更强大的功能

3、语法

@事件名.修饰符="methods里函数"

    • .stop - 阻止事件冒泡
    • .prevent - 阻止默认行为
    • .once - 程序运行期间, 只触发一次事件处理函数
<template>
  <div @click="fatherFn">
    <!-- vue对事件进行了修饰符设置, 在事件后面.修饰符名即可使用更多的功能 -->
    <button @click.stop="btn">.stop阻止事件冒泡</button>
    <a href="http://www.baidu.com" @click.prevent="btn">.prevent阻止默认行为</a>
    <button @click.once="btn">.once程序运行期间, 只触发一次事件处理函数</button>
  </div>
</template>

<script>
export default {
  methods: {
    fatherFn(){
      console.log("father被触发");
    },
    btn(){
      console.log(1);
    }
  }
}
</script>

4、总结

修饰符给事件扩展额外功能

vue 有哪些主要修饰符,都有什么功能?

1、.stop - 阻止事件冒泡

2、.prevent - 阻止默认行为

3、.once - 只执行一次事件处理函数


七、vue指令-v-on按键修饰符

1、思考

1、以前我想判断用户是否按下回车怎么做?

2、鼠标事件有修饰符,那按键有修饰符吗?

2、目标

给键盘事件, 添加修饰符, 增强能力

3、语法

更多修饰符

<template>
  <div>
    <input type="text" @keydown.enter="enterFn">
    <hr>
    <input type="text" @keydown.esc="escFn">
  </div>
</template>

<script>
export default {
 methods: {
   enterFn(){
     console.log("enter回车按键了");
   },
   escFn(){
     console.log("esc按键了");
   }
 }
}
</script>

4、总结

多使用事件修饰符, 可以提高开发效率, 少去自己判断过程

1、按键修饰符如何用?

@键盘事件.按键修饰符=“methods 里函数名”

2、有哪些主要按键修饰符?

1、.enter - 只要按下回车才能触发这个键盘事件函数
2、.esc - 只要按下取消键才能触发这个键盘事件函数


练习-翻转世界

1、目标

点击按钮 - 把文字取反显示 - 再点击取反显示(回来了)

提示把字符串取反赋予回去

效果演示:

2、思考

1、如何反转字符串?

2、视图如何实时更新?

3、分析

1、定义变量 message:‘HELLO, WORLD’

2、插值表达式赋予到dom上, 准备按钮和文字

3、按钮绑定点击事件和函数

4、对message值用split拆分, 返回数组

5、数组元素翻转用reverse方法

6、再把数组用join拼接成字符串赋予给message

7、因为Vue是MVVM设计模式, 数据驱动视图, 所以视图自动改变

正确代码:

<template>
  <div>
    <h1>{
  { message }}</h1>
    <button @click="btn">逆转世界</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: "HELLO, WORLD",
    };
  },
  methods: {
    btn(){
      this.message = this.message.split("").reverse().join("")
    }
  }
};
</script>

4、总结

记住方法特点, 多做需求, vue是数据变化视图自动更新, 减少操作DOM时间, 提高开发效率

点击翻转字符串你有什么收获?

1、写需求要先静态标签, 再考虑动态效果, 找好第一步干什么

2、记住方法的特点 – 可以自己总结字典和口诀

3、Vue是靠数据驱动视图, 只需要关心数据变化即可


九、vue指令 v-model

1、思考

1、js中获取表单的值, 赋予给变量?

2、js变量改变, 同步显示到表单里?

3、Vue能否把他们互相关联起来呢?

2、目标

把value属性和vue数据变量, 双向绑定到一起

3、语法

  • 语法: v-model="vue数据变量"
  • 双向数据绑定
    • 数据变化 -> 视图自动同步
    • 视图变化 -> 数据自动同步
  • 演示: 用户名绑定 - vue内部是MVVM设计模式
<template>
  <div>
    <!-- 
    	v-model:是实现vuejs变量和表单标签value属性, 双向绑定的指令
    -->
    <div>
      <span>用户名:</span>
      <input type="text" v-model="username" />
    </div>
    <div>
      <span>密码:</span>
      <input type="password" v-model="pass" />
    </div>
    <div>
      <span>来自于: </span>
      <!-- 下拉菜单要绑定在select上 -->
      <select v-model="from">
        <option value="北京市">北京</option>
        <option value="南京市">南京</option>
        <option value="天津市">天津</option>
      </select>
    </div>
    <div>
      <!-- (重要)
      遇到复选框, v-model的变量值
      非数组 - 关联的是复选框的checked属性
      数组   - 关联的是复选框的value属性
       -->
      <span>爱好: </span>
      <input type="checkbox" v-model="hobby" value="抽烟">抽烟
      <input type="checkbox" v-model="hobby" value="喝酒">喝酒
      <input type="checkbox" v-model="hobby" value="写代码">写代码
    </div>
    <div>
      <span>性别: </span>
      <input type="radio" value="男" name="sex" v-model="gender">男
      <input type="radio" value="女" name="sex" v-model="gender">女
    </div>
    <div>
      <span>自我介绍</span>
      <textarea v-model="intro"></textarea>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: "",
      pass: "",
      from: "",
      hobby: [], 
      gender: "",
      intro: "",
    };
    // 总结:
    // 特别注意: v-model, 在input[checkbox]的多选框状态
    // 变量为非数组, 则绑定的是checked的属性(true/false) - 常用于: 单个绑定使用
    // 变量为数组, 则绑定的是他们的value属性里的值 - 常用于: 收集勾选了哪些值
  }
};
</script>

4、总结

本阶段v-model只能用在表单元素上, 以后学组件后讲v-model高级用法

1、v-model用在哪里?

暂时只能用在表单标签上

2、v-model有什么作用?

把vue的数据变量和表单的value属性双向绑定在一起

5、扩展

实现原理:

<input type="text" v-on:input="msg = $event.target.value" v-bind:value="msg" />

代码:

export default {
  data() {
    return {
      msg: '',
    };
  },
};

十、vue指令 v-model绑定不同表单

1、思考

1、下拉菜单, 复选框, 单选框如何绑定Vue变量呢?

2、小结

1、下拉菜单v-model写在哪里?

在select, value在option上

2、v-model用在复选框时, 需要注意什么?

v-model的vue变量是

非数组 – 关联的是checked属性

数组 – 关联的是value属性

3、vue变量初始值会不会影响表单的默认状态?

会影响, 因为双向数据绑定-互相影响


十一、vue指令 v-model修饰符

1、思考

1、表单同步到变量里的 数 是什么类型的呢?

2、能否让v-model转成数值再赋予给变量呢?

2、目标

让v-model拥有更强大的功能

3、语法

v-model.修饰符="vue数据变量"

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值