vue3官网文档学习、复习笔记(快速上手)

news2024/12/23 17:21:02

目录

2.Attribute 绑定(v-bind)

3.事件监听(v-on)

4.表单绑定(v-model)

5.条件渲染(v-if)

6.列表渲染(v-for)

 all.value = all.value.filter((t) => t !== all)

7.计算属性(computed())

8.生命周期和模板引用(onMounted、ref=)

9.侦听器(watch())

10.组件(ChildComp)

11.Props(使用父组件动态数据defineProps())

12.Emits(子组件向父组件触发事件)

13.插槽(slots)


能在改变时触发更新的状态被称作是响应式的。我们可以使用 Vue 的 reactive() API 来声明响应式状态。由 reactive() 创建的对象都是 JavaScript Proxy,其行为与普通对象一样:

reactive() 只适用于对象 (包括数组和内置类型,如 Map 和 Set)。而另一个 API ref() 则可以接受任何值类型。ref 会返回一个包裹对象,并在 .value 属性下暴露内部值。

reactive() 和 ref() 的细节:响应式基础 | Vue.js (vuejs.org)

例:

<script setup>
import { reactive, ref } from 'vue'

const counter = reactive({ count: 0 })
const message = ref('Hello World!')
</script>

<template>
  <h1>{{ message }}</h1>
  <p>Count is: {{ counter.count }}</p>
</template>

注意我们在模板中访问的 message ref 时不需要使用 .value:它会被自动解包,让使用更简单。

2.Attribute 绑定(v-bind)

mustache 语法 (即双大括号) 只能用于文本插值。为了给 attribute 绑定一个动态值,需要使用 v-bind 指令

例:

把一个动态的 class 绑定添加到这个 <h1> 上,并使用 titleClass 的 ref 作为它的值。如果绑定正确,文字将会变为红色。

<script setup>
import { ref } from 'vue'

const titleClass = ref('title')
</script>

<template>
  <h1 :class="titleClass">Make me red</h1>
</template>

<style>
.title {
  color: red;
}
</style>

3.事件监听(v-on)

例:

尝试自行实现 increment 函数并通过使用 v-on 将其绑定到按钮上

<script setup>
import { ref } from 'vue'

const count = ref(0)

function increment() {
  count.value++
}
</script>

<template>
  <button @click="increment">count is: {{ count }}</button>
</template>

4.表单绑定(v-model)

我们可以同时使用 v-bind 和 v-on 来在表单的输入元素上创建双向绑定

为了简化双向绑定,Vue 提供了一个 v-model 指令,它实际上是上述操作的语法糖

例:

试着在文本框里输入——你会看到 <p> 里的文本也随着你的输入更新了

<script setup>
import { ref } from 'vue'

const text = ref('')
</script>

<template>
  <input v-model="text" placeholder="Type here">
  <p>{{ text }}</p>
</template>

5.条件渲染(v-if)

例:

同时展示了两个 <h1> 标签,并且按钮不执行任何操作。尝试给它们添加 v-if 和 v-else 指令,并实现 toggle() 方法,让我们可以使用按钮在它们之间切换。

<script setup>
import { ref } from 'vue'

const awesome = ref(true)

function toggle() {
  awesome.value = !awesome.value
}
</script>

<template>
  <button @click="toggle">toggle</button>
  <h1 v-if="awesome">Vue is awesome!</h1>
  <h1 v-else>Oh no 😢</h1>
</template>

6.列表渲染(v-for)

 例:

这里有一个简单的 todo 列表——试着实现一下 addTodo() 和 removeTodo() 这两个方法的逻辑,使列表能够正常工作!

<script setup>
import { ref } from 'vue'

// 给每个 todo 对象一个唯一的 id
let id = 0

const newTodo = ref('')
const todos = ref([
  { id: id++, text: 'Learn HTML' },
  { id: id++, text: 'Learn JavaScript' },
  { id: id++, text: 'Learn Vue' }
])

function addTodo() {
  todos.value.push({ id: id++, text: newTodo.value })
  newTodo.value = ''
}

function removeTodo(todo) {
  todos.value = todos.value.filter((t) => t !== todo)
}
</script>

<template>
  <form @submit.prevent="addTodo">
    <input v-model="newTodo">
    <button>Add Todo</button>    
  </form>
  <ul>
    <li v-for="todo in todos" :key="todo.id">
      {{ todo.text }}
      <button @click="removeTodo(todo)">X</button>
    </li>
  </ul>
</template>

 all.value = all.value.filter((t) => t !== all)

该代码通过删除任何等于 的元素来筛选数组中的元素。然后将过滤后的结果分配回 。todos.value.filter((t) => t !== todo)

当您要从数组中删除特定元素时,可以使用此代码。它遍历数组中的每个元素 () 并检查它是否不等于 。如果条件为 true,则该元素将保留在筛选结果中,否则将删除该元素。

过滤后,生成的数组被赋回变量,有效地使用修改后的数组对其进行更新

<form @submit.prevent=“addTodo”>

该代码为元素上的事件设置事件处理程序。提交表单时,它会调用 Vue.js 实例中指定的方法或函数。<form @submit.prevent="addTodo">

该指令阻止默认表单提交行为,这通常涉及刷新页面或导航到新 URL。相反,它允许您定义自定义逻辑以使用该方法处理表单提交

7.计算属性(computed())

计算属性会自动跟踪其计算中所使用的到的其他响应式状态,并将它们收集为自己的依赖。计算结果会被缓存,并只有在其依赖发生改变时才会被自动更新。

例:

试着添加 filteredTodos 计算属性并实现计算逻辑!如果实现正确,在隐藏已完成项目的状态下勾选一个 todo,它也应当被立即隐藏。

<script setup>
import { ref, computed } from 'vue'

let id = 0

const newTodo = ref('')
const hideCompleted = ref(false)
const todos = ref([
  { id: id++, text: 'Learn HTML', done: true },
  { id: id++, text: 'Learn JavaScript', done: true },
  { id: id++, text: 'Learn Vue', done: false }
])

const filteredTodos = computed(() => {
  return hideCompleted.value
    ? todos.value.filter((t) => !t.done)
    : todos.value
})

function addTodo() {
  todos.value.push({ id: id++, text: newTodo.value, done: false })
  newTodo.value = ''
}

function removeTodo(todo) {
  todos.value = todos.value.filter((t) => t !== todo)
}
</script>

<template>
  <form @submit.prevent="addTodo">
    <input v-model="newTodo">
    <button>Add Todo</button>
  </form>
  <ul>
    <li v-for="todo in filteredTodos" :key="todo.id">
      <input type="checkbox" v-model="todo.done">
      <span :class="{ done: todo.done }">{{ todo.text }}</span>
      <button @click="removeTodo(todo)">X</button>
    </li>
  </ul>
  <button @click="hideCompleted = !hideCompleted">
    {{ hideCompleted ? 'Show all' : 'Hide completed' }}
  </button>
</template>

<style>
.done {
  text-decoration: line-through;
}
</style>

8.生命周期和模板引用(onMounted、ref=)

 要在挂载之后执行代码,我们可以使用 onMounted() 函数

例:

尝试添加一个 onMounted 钩子,然后通过 pElementRef.value 访问 <p>,并直接对其执行一些 DOM 操作。(例如修改它的 textContent)。

<script setup>
import { ref, onMounted } from 'vue'

const pElementRef = ref(null)

onMounted(() => {
  pElementRef.value.textContent = 'mounted!'
})
</script>

<template>
  <p ref="pElementRef">hello</p>
</template>

 结果解释:

给定的代码是使用该语法的 Vue 3 单文件组件 (SFC)。以下是它的功能的细分:<script setup>

  1. 该语句从 'vue' 包导入必要的函数。这些函数用于创建反应式引用和处理组件生命周期事件。

  2. 常量是使用该函数创建的。它将引用初始化为 。

  3. 调用该函数,该函数设置在 DOM 中挂载组件时要执行的回调。在这种情况下,回调函数将 的文本内容设置为“mounted!

  4. 该部分包含组件的 HTML 模板。在模板内部,有一个带有属性的元素。此属性将引用绑定到元素,允许操作其属性。

挂载组件时,会触发回调,并将 引用的元素的文本内容设置为“mounted!因此,渲染的输出将显示“mounted!”而不是“hello”。

9.侦听器(watch())

有时我们需要响应性地执行一些“副作用”——例如,当一个数字改变时将其输出到控制台。我们可以通过侦听器来实现它:

watch() 可以直接侦听一个 ref,并且只要 count 的值改变就会触发回调

例:

<script setup>
import { ref, watch } from 'vue'

const todoId = ref(1)
const todoData = ref(null)

async function fetchData() {
  todoData.value = null
  const res = await fetch(
    `https://jsonplaceholder.typicode.com/todos/${todoId.value}`
  )
  todoData.value = await res.json()
}

fetchData()

watch(todoId, fetchData)
</script>

<template>
  <p>Todo id: {{ todoId }}</p>
  <button @click="todoId++">Fetch next todo</button>
  <p v-if="!todoData">Loading...</p>
  <pre v-else>{{ todoData }}</pre>
</template>

 代码解释:

  1. 该语句从 'vue' 包导入必要的函数 、 和。 用于创建反应式引用,用于监视反应式引用中的更改,并且是用于发出 HTTP 请求的浏览器 API。
  2. 使用函数创建两个反应式引用:和。 初始值为 1,最初设置为 null。
  3.  定义了一个异步函数,该函数使用当前值从指定的 URL 获取待办事项数据。最初,它设置为 null,提取数据,并使用提取的 JSON 响应进行更新。
  4. 该函数在定义后立即调用,获取初始待办事项数据。
  5. 该函数用于监视反应式引用的变化。每当更改时,都会再次调用该函数以根据更新的值获取新的待办事项数据。
  6. 在该部分中,有一个段落 () 元素显示 的当前值
  7. 存在一个带有事件侦听器的按钮,该按钮在单击时递增值,触发函数并使用更新的
  8. 下一个元素使用该指令有条件地呈现“正在加载...”何时是伪造的(最初或在数据获取过程中)
  9. 在最后一个元素中,该指令用于在元素内呈现,一旦它变得真实,将获取的待办事项数据显示为格式化的JSON对象

10.组件(ChildComp)

真正的 Vue 应用往往是由嵌套组件创建的。

父组件可以在模板中渲染另一个组件作为子组件。要使用子组件,我们需要先导入它:

import ChildComp from './ChildComp.vue'

然后我们就可以在模板中使用组件,就像这样:

<ChildComp />

例:

现在尝试一下导入子组件并在模板中渲染它

<script setup>
import ChildComp from './ChildComp.vue'
</script>

<template>
  <ChildComp />
</template>

ChildComp.vue

<template>
  <h2>A Child Component!</h2>
</template>

11.Props(使用父组件动态数据defineProps())

子组件可以通过 props 从父组件接受动态数据。首先,需要声明它所接受的 props:

<!-- ChildComp.vue -->
<script setup>
const props = defineProps({
  msg: String
})
</script>

注意 defineProps() 是一个编译时宏,并不需要导入。一旦声明,msg prop 就可以在子组件的模板中使用。它也可以通过 defineProps() 所返回的对象在 JavaScript 中访问。

父组件可以像声明 HTML attributes 一样传递 props。若要传递动态值,也可以使用 v-bind 语法:

<ChildComp :msg="greeting" />

例:

ChildComp.vue

<script setup>
const props = defineProps({
  msg: String
})
</script>

<template>
  <h2>{{ msg || 'No props passed yet' }}</h2>
</template>

父组件:

<script setup>
import { ref } from 'vue'
import ChildComp from './ChildComp.vue'

const greeting = ref('Hello from parent')
</script>

<template>
  <ChildComp :msg="greeting" />
</template>

12.Emits(子组件向父组件触发事件)

除了接收 props,子组件还可以向父组件触发事件:

<script setup>
// 声明触发的事件
const emit = defineEmits(['response'])

// 带参数触发
emit('response', 'hello from child')
</script>

emit() 的第一个参数是事件的名称。其他所有参数都将传递给事件监听器。

父组件可以使用 v-on 监听子组件触发的事件——这里的处理函数接收了子组件触发事件时的额外参数并将它赋值给了本地状态:

<ChildComp @response="(msg) => childMsg = msg" />


例:

父组件:

<script setup>
import { ref } from 'vue'
import ChildComp from './ChildComp.vue'

const childMsg = ref('No child msg yet')
</script>

<template>
  <ChildComp @response="(msg) => childMsg = msg" />
  <p>{{ childMsg }}</p>
</template>

ChildComp.vue

<script setup>
const emit = defineEmits(['response'])

emit('response', 'hello from child')
</script>

<template>
  <h2>Child component</h2>
</template>

13.插槽(slots)

<slot> 插口中的内容将被当作“默认”内容:它会在父组件没有传递任何插槽内容时显示

例:

没有给 <ChildComp> 传递任何插槽内容,所以你将看到默认内容。让我们利用父组件的 msg 状态为子组件提供一些插槽内容

ChildComp.vue

<template>
  <slot>Fallback content</slot>
</template>

父组件:

<script setup>
import { ref } from 'vue'
import ChildComp from './ChildComp.vue'

const msg = ref('from parent')
</script>

<template>
  <ChildComp>Message: {{ msg }}</ChildComp>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++]类与对象(下) -- 初始化列表 -- static成员 -- 友元 -- 内部类,一篇带你深度了解。

目录 1、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.2.1 初始化列表的意义 1.3 explicit关键字 2、static成员 2.1 问题引入 2.2 特性 3、友元 3.1 友元函数 3.2 友元类 4、内部类 1、再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通…

改进的麻雀算法优化最大相关峭度解卷积(SCSSA-MCKD),实现早期微弱故障诊断,MATLAB代码实现

01 引言 由于一些设备的早期故障产生的冲击十分微弱&#xff0c;易被系统噪声干扰&#xff0c;如何有效地对设备的原始故障信号进行降噪并增强信号中微弱冲击成分&#xff0c;是进行该类部件早期故障诊断的关键。 最大相关峭度解卷积&#xff08;MCKD&#xff09;通过解卷积运算…

干翻Dubbo系列第九篇:Dubbo体系中序列化详解

文章目录 文章说明 一&#xff1a;序列化概念 1&#xff1a;概念 2&#xff1a;Dubbo中序列化方式 二&#xff1a;Kyro序列化方案 1&#xff1a;引入依赖 2&#xff1a;XML的配置方式 3&#xff1a;Boot的方式 4&#xff1a;Consumer端调用 三&#xff1a;FST序列化方…

JVM 调优实例

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM提供了多种垃圾回收器&#xff0c;可以根据应用程序的需求选择最适合的垃圾回收器。例如&#xff0c;如果应用程序需要更快的响应时间&#xff0c;可以选择并行垃圾回收…

GIS在地质灾害危险性评估与灾后重建中的应用教程

详情点击链接&#xff1a;GIS在地质灾害危险性评估与灾后重建中的实践技术应用 前言 地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质…

【JavaSE】接口的语法知识和使用方法总结

目录 1. 接口的概念 2. 语法规则 3. 接口特性 4. 接口使用 5. 实现多个接口 6. 接口间的继承 1. 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#x…

Unity游戏源码分享-仿开心消消乐Match3Jewel

Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88198762

蚁剑antSword-maste下载-安装-使用-一句话木马

下载 https://github.com/AntSwordProject/antSword 一句话木马 hack.php脚本 <?php eval($_POST[attack]);?> 安装 1、安装完成后启动 2、初始化&#xff0c;选择有源码的目录 3、连接

为什么要使用融合CDN,单CDN与多CDN之间的差异对比

CDN是现代互联网服务的重要组成部分&#xff0c;它CDN可帮助内容提供者高速交付内容&#xff0c;不同的服务器部署在全球不同的数据中心&#xff0c;并在它们之间共享相同的网络路径。随着企业意识到CDN的重要性&#xff0c;越来越多的企业正在使用CDN作为内容分发工具。互联网…

RocketMQ发送消息失败:error CODE: 14 DESC: service not available now, maybe disk full

在执行业务时&#xff0c;发现MQ控制台没有查询到消息&#xff0c;在日志中发现消息发送失败&#xff0c;报错error CODE: 14 DESC: service not available now, maybe disk full 分析报错应该是磁盘空间不足&#xff0c;导致broker不能进行正常的消息存储刷盘&#xff0c;去查…

Java中数组分析

Java中数组分析 先进行专栏介绍 数组声明和初始化一个数组方法一&#xff1a;声明数组并分配空间&#xff1a;可以使用以下语法声明一个数组&#xff0c;并指定数组的长度。举例 方法二&#xff1a;声明数组并初始化元素&#xff1a;可以在声明数组时&#xff0c;同时为数组的元…

HOperatorSet.OpenFramegrabber “GigEVision“

HOperatorSet.OpenFramegrabber "GigEVision"访问失败 直接跳出 但其他算子可以访问 重装halcon x86

内网隧道—HTTP\DNS\ICMP

本文仅限于安全研究和学习&#xff0c;用户承担因使用此工具而导致的所有法律和相关责任&#xff01; 作者不承担任何法律和相关责任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…

量化交易可视化(7)-散点图

散点图的含义 散点图是一种用于观察两个变量之间关系的图表类型。它通过在坐标轴上绘制数据点来展示变量之间的关联程度。每个数据点代表一个观测值&#xff0c;其中横轴表示一个变量的值&#xff0c;纵轴表示另一个变量的值。 散点图的绘制方法 matplotlib.pyplot.scatter(…

Java:企业级java后端开发,需要掌握哪些内容

一、什么是后端开发 后端开发是指开发基于服务器端的软件应用程序&#xff0c;也称为系统的后台或服务器端编程。 后端程序员负责处理网站或应用程序后台的逻辑和功能&#xff0c;包括数据库管理、服务器端脚本编写、API设计、数据安全性、网站性能优化等。 后端开发技术通常包…

position 属性有哪些值,分别表示什么意思?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ static&#xff08;静态定位&#xff09;⭐ relative&#xff08;相对定位&#xff09;⭐ absolute&#xff08;绝对定位&#xff09;⭐ fixed&#xff08;固定定位&#xff09;⭐ sticky&#xff08;粘性定位&#xff09;⭐ initial⭐ i…

机器视觉、图像处理和计算机视觉:概念和区别

机器视觉、图像处理和计算机视觉是相关但有区别的概念。 机器视觉主要应用于工业领域&#xff0c;涉及图像感知、图像处理、控制理论和软硬件的结合&#xff0c;旨在实现高效的运动控制或实时操作。 图像处理是指利用计算机对图像进行复原、校正、增强、统计分析、分类和识别…

【在一个升序数组中插入一个数仍升序输出】

在一个升序数组中插入一个数仍升序输出 题目举例&#xff1a; 有一个升序数组nums&#xff0c;给一个数字data&#xff0c;将data插入数组nums中仍旧保证nums升序&#xff0c;返回数组中有效元素个数。 比如&#xff1a;nums[100] {1, 2, 3, 5, 6, 7, 8, 9} size 8 data 4 …

【雕爷学编程】Arduino动手做(201)---DFRobot 行空板05

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

【雕爷学编程】Arduino动手做(199)---8x32位WS2812B全彩屏模块7

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…