前端学习随笔(一)

v-on v-model v-bind

在Vue.js中,v-onv-modelv-bind是三个核心指令,它们在Vue应用中扮演着不同的角色。下面是对这三个指令的详细介绍,包括它们的区别、简写以及使用示例。

一、v-bind

v-bind指令用于动态地绑定一个或多个特性,或一个组件prop到一个表达式。

  1. 功能

    • 将Vue实例的数据绑定到HTML元素的属性上,实现数据的动态更新。
  2. 区别

    • v-model不同,v-bind是单向绑定,数据只能从Vue实例流向DOM,不能反向流动。
    • v-on不同,v-bind用于属性绑定,而不是事件监听。
  3. 简写

    • v-bind:attribute可以简写为:attribute
  4. 示例

    html 复制代码
    <div id="app">
      <a v-bind:href="url">链接</a>
      <!-- 简写 -->
      <a :href="url">链接</a>
      <img v-bind:src="imageSrc" alt="描述">
      <!-- 简写 -->
      <img :src="imageSrc" alt="描述">
    </div>
    
    <script>
    new Vue({
      el: '#app',
      data: {
        url: 'https://www.example.com',
        imageSrc: 'https://www.example.com/image.jpg'
      }
    });
    </script>

二、v-on

v-on指令用于监听DOM事件,并在触发时运行一些JavaScript代码。

  1. 功能

    • 监听元素上的事件,并在事件触发时调用指定的方法。
  2. 区别

    • v-bind不同,v-on用于事件监听,而不是属性绑定。
    • v-model不同,v-on只是单向的事件监听和触发,不涉及数据的双向绑定。
  3. 简写

    • v-on:event可以简写为@event
  4. 示例

    html 复制代码
    <div id="app">
      <button v-on:click="greet">点击我</button>
      <!-- 简写 -->
      <button @click="greet">点击我</button>
      <input v-on:input="updateValue" placeholder="输入内容">
      <!-- 简写 -->
      <input @input="updateValue" placeholder="输入内容">
    </div>
    
    <script>
    new Vue({
      el: '#app',
      methods: {
        greet() {
          alert('Hello Vue!');
        },
        updateValue(event) {
          console.log(event.target.value);
        }
      }
    });
    </script>

三、v-model

v-model指令在表单输入和应用状态之间创建双向数据绑定。

  1. 功能

    • 在表单控件元素上创建双向数据绑定,当输入元素的值发生变化时,绑定的数据也会同步更新;反之亦然。
  2. 区别

    • v-bind不同,v-model是双向绑定,数据可以在Vue实例和DOM之间双向流动。
    • v-on不同,v-model不仅监听事件,还自动更新数据,并且通常用于表单输入元素。
  3. 简写

    • v-model没有缩写形式,但可以直接使用v-model="dataProperty"
  4. 示例

    html 复制代码
    <div id="app">
      <input v-model="message" placeholder="编辑消息">
      <p>消息是:{{ message }}</p>
      <textarea v-model="description" placeholder="输入描述"></textarea>
      <p>描述是:{{ description }}</p>
    </div>
    
    <script>
    new Vue({
      el: '#app',
      data: {
        message: '',
        description: ''
      }
    });
    </script>

在这个示例中,当用户在输入框或文本区域中输入文本时,messagedescription数据的值会同步更新;同样地,如果这些数据在别处被修改,输入框和文本区域中的内容也会相应更新。

总结

  • v-bind:用于单向绑定HTML属性或组件prop到Vue实例的数据。
  • v-on:用于监听DOM事件并在事件触发时执行相应的方法。
  • v-model:用于在表单输入元素上创建双向数据绑定。

这三个指令在Vue.js开发中非常常用,掌握它们的用法和区别对于构建高效的Vue应用至关重要。

v-model 实现原理

v-model是Vue.js框架中的一个核心指令,它主要用于实现表单元素和Vue实例数据的双向绑定。以下是v-model实现原理的详细介绍:

一、基本机制

v-model通过绑定表单元素的value属性(对于inputtextarea等)或selected属性(对于select)等,并监听相应的输入事件(如inputchange等),来实现数据的双向绑定。

  1. 绑定属性

    • 对于文本输入框(input[type="text"]textarea等),v-model会绑定value属性。
    • 对于单选按钮(input[type="radio"])、复选框(input[type="checkbox"])和下拉选择框(select),v-model会绑定相应的checkedselected属性,并处理选中状态。
  2. 监听事件

    • 当用户在表单元素中输入内容时,会触发相应的输入事件(如input事件对于文本输入框,change事件对于下拉选择框等)。
    • Vue.js会监听这些事件,并在事件触发时,将表单元素的值更新到Vue实例中的数据属性上。

二、实现原理

v-model的实现原理主要依赖于Vue.js的响应式系统和模板编译机制。

  1. 响应式系统

    • Vue.js通过Object.defineProperty()方法(在Vue 3中通过Proxy对象)将Vue实例的data属性转换为getter和setter函数。
    • 当属性被读取时,会触发getter函数;当属性被修改时,会触发setter函数。
    • Setter函数负责通知依赖进行更新,从而实现数据的响应式更新。
  2. 模板编译

    • Vue.js在渲染模板时,会遍历模板中的表达式和指令,并进行依赖收集。
    • 对于v-model指令,Vue.js会自动为绑定了v-model的表单元素添加一个value属性和一个输入事件监听器(如input事件)。
    • 当表单元素的值发生变化时,会触发输入事件监听器,进而调用setter函数更新Vue实例中的数据属性。
  3. 双向绑定

    • 当Vue实例中的数据属性发生变化时,Vue.js会通过setter函数通知依赖进行更新。
    • 对于v-model绑定的表单元素,Vue.js会自动将新的值反映到表单元素上,使其显示最新的值。
    • 这样就实现了数据的双向绑定:表单元素的值变化会更新Vue实例中的数据属性,Vue实例中的数据属性变化也会更新表单元素的值。

三、示例

以下是一个简单的示例,展示了如何使用v-model实现数据的双向绑定:

html 复制代码
<div id="app">
  <input v-model="message" placeholder="输入消息">
  <p>消息是:{{ message }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    message: ''
  }
});
</script>

在这个示例中,input元素通过v-model指令与Vue实例中的message属性进行了双向绑定。当用户在input元素中输入内容时,message属性的值会同步更新;同样地,当message属性的值在别处被修改时(例如通过Vue实例的方法或计算属性),input元素中的内容也会相应更新。

综上所述,v-model的实现原理主要依赖于Vue.js的响应式系统和模板编译机制。通过绑定表单元素的属性和监听输入事件,v-model实现了数据的双向绑定,从而简化了开发人员对表单数据的处理和管理。

空值合并运算符 ?

空值合并运算符(??)是ECMAScript 2020(ES11)中引入的一个逻辑运算符,用于为可能是 nullundefined 的表达式提供一个默认值。当左侧的表达式结果为 nullundefined 时,它会返回右侧的表达式结果;否则,它会返回左侧表达式的结果。

语法

javascript 复制代码
leftExpr ?? rightExpr
  • leftExpr:要检查的表达式。
  • rightExpr:当 leftExprnullundefined 时返回的默认值。

工作原理

  1. 检查左侧表达式 :首先,计算 leftExpr 的值。
  2. 判断是否为空值 :如果 leftExpr 的结果是 nullundefined,则返回 rightExpr 的值。
  3. 返回左侧表达式的值 :如果 leftExpr 的结果不是 nullundefined(即使它是 0""(空字符串)、NaNfalse),也返回 leftExpr 的值。

与逻辑或运算符的区别

逻辑或运算符(||)也会在左侧表达式为假值(falsy value)时返回右侧表达式的值,而假值不仅包括 nullundefined,还包括 0""(空字符串)、NaNfalse 以及 BigInt(0)Symbol(0)(在ECMAScript 2019及更高版本中)。

相比之下,空值合并运算符仅当左侧表达式为 nullundefined 时才返回右侧表达式的值,这使得它在处理可能未定义的变量时更加精确和有用。

示例

javascript 复制代码
let foo = null;
let bar = "default string";

console.log(foo ?? bar); // 输出: "default string"

foo = 0;
console.log(foo ?? bar); // 输出: 0,因为 0 不是 null 或 undefined

foo = "";
console.log(foo || bar); // 输出: "default string",因为 "" 是假值(falsy)
console.log(foo ?? bar); // 输出: "",因为 "" 不是 null 或 undefined

在上面的示例中,foo ?? barfoonull 时返回 bar 的值,而在 foo0 或空字符串时则返回 foo 本身的值。相比之下,foo || barfoo 为任何假值时都会返回 bar 的值。

实际应用

空值合并运算符在编程中非常有用,特别是当你想要为可能未定义的变量提供一个默认值时。它可以帮助你避免使用更冗长的条件语句(如三元运算符或 if 语句)来检查变量是否为 nullundefined

JavaScript(简称JS)和TypeScript(简称TS)区别

JavaScript(简称JS)和TypeScript(简称TS)都是用于编写Web应用程序的语言,它们之间存在一些显著的区别。以下是对这两种语言的详细介绍和对比:

一、基本特性

  1. JS

    • 是一种脚本语言,用于创建动态网页。
    • 弱类型,没有静态类型选项。
    • 基于原型编程,是一种多范式的动态脚本语言,支持面向对象、命令式和声明式(如函数式编程)编程。
  2. TS

    • 是JS的超集,包含了JS的所有特性。
    • 用于解决大型项目的代码复杂性。
    • 强类型,支持静态和动态类型。

二、数据类型

  1. JS

    • 数据类型包括string、number、boolean、null、undefined、object、array、function、symbol(ES6中引入)。
  2. TS

    • 数据类型更加丰富,包括布尔值、数字、字符串、数组、元组(tuple)、枚举(enum)、any、void、null、undefined、never、object、unknown等。
    • 提供了类型声明和类型断言等特性,增加了代码的安全性和可维护性。

三、类型检查

  1. JS

    • 变量类型声明不是强制性的,因为JS是一种动态类型语言,变量的类型会在运行时自动确定。
  2. TS

    • 支持静态类型检查,可以在编译时检查类型错误,从而减少运行时错误和调试时间。
    • 指定类型后,当变量赋值时,TS编译器就会自动检查值是否符合声明类型,如果符合就赋值,不符合就报错。

四、类和接口

  1. JS

    • 是一种基于原型的语言,而不是传统的面向对象语言。
    • 不支持模块、泛型或接口。
  2. TS

    • 在JS的基础上添加了类、接口、继承、泛型等面向对象编程的概念和特性。
    • 允许模块化编程,可以把声明、数据、函数和类封装在模块中。

五、编译与执行

  1. JS

    • 可以直接在浏览器中运行,不需要编译。
  2. TS

    • 需要将代码编译为JS代码才能在浏览器中执行。
    • 支持把代码编译为ES3、ES4、ES5、ES6+等指定的语法规范。

六、其他特性

  1. JS

    • 有自身的基本数据类型、表达式和算术运算符及程序的基本程序框架。
    • 是一种采用事件驱动的脚本语言,不需要经过Web服务器就可以对用户的输入做出响应。
    • 具有跨平台特性,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。
  2. TS

    • 提供了类型推断机制,降低了开发成本。
    • 增加了可选参数、重载、重写等特性,提高了代码的灵活性和可维护性。
    • 提供了更好的开发工具支持,包括代码编辑器、调试器和自动化构建工具等。
相关推荐
*neverGiveUp*3 分钟前
React实现地图找房
前端·react.js·前端框架
冷环渊3 分钟前
React快速上手到项目实战总篇
前端·javascript·react.js·前端框架·ant design·antd
前端郭德纲4 分钟前
React 数据是怎样传递的
前端·react.js·前端框架
yqcoder6 分钟前
React 如何进行路由变化监听
前端·javascript·react.js
1234Wu21 分钟前
前端工程化之手搓webpack5 --【elpis全栈项目】
前端·webpack
找了一圈尾巴29 分钟前
Wend看源码-Java-Arrays 工具集学习
java·开发语言·学习
GISer_Jing40 分钟前
Ant Design中Flex布局、Grid布局和Layout布局详解
前端·css·前端框架·anti-design-vue
吃土的女孩1 小时前
开发者的秘密武器:用MemFire Cloud快速上线项目
前端·javascript·后端
crazy的蓝色梦想1 小时前
【超详细】React SSR 服务端渲染实战
前端·javascript·react.js