前端知识一

(ref函数)1.为什么vue3中使用ref来创建响应式数据,而不是直接声明一个变量

import { ref } from "vue";

const count = ref(0); // 创建一个响应式的计数器,初始值为0

function increment() {
  count.value++; // 增加计数器的值
}

function decrement() {
  count.value--; // 减少计数器的值
}

ref是Vue 3 Composition API中提供的一个函数,用于创建一个响应式数据的引用。
当您使用ref创建一个变量时(比如const count = ref(0);),Vue的响应式系统就能够追踪到这个变量的变化,当count.value被修改时,Vue会自动更新依赖于count的DOM。
此外,ref不仅限于基本数据类型,还可以用于对象或数组等复杂数据类型。这使得ref在处理各种类型的数据时都非常灵活。
综上所述,使用ref是为了让Vue的响应式系统能够追踪到数据的变化,从而自动更新DOM。如果您直接声明一个变量而不使用ref,那么Vue将无法追踪到这个变量的变化,也就无法实现响应式更新。

(inject函数)2.inject函数

inject是用来从祖先组件中获取数据的函数。在Vue中,组件可以嵌套,有时候一个深层的子组件需要用到顶层或中间某层祖先组件的数据。这时,如果每层组件都通过props来传递数据,就会显得很繁琐。Vue提供了provide和inject这两个函数来解决这个问题。

provide在祖先组件中用来提供数据,而inject在后代组件中用来获取这些数据。
如你有一个顶层组件,它提供了一个用户的名字:

// 顶层组件
import { provide } from "vue";

const userName = "张三";
provide("userNameKey", userName); // 提供用户名,键为"userNameKey"

然后在深层子组件中,可以这样获取用户名:

import { inject } from "vue";

const userName = inject("userNameKey"); // 获取用户名,键为"userNameKey"
console.log(userName); // 输出:张三

注意,inject的参数是你从provide那里得到的键名

3. import和export

import和export是javaScript ES6模块系统中的语法,用于导入和导出模块的功能或数据,在vue3中,他们被广泛应用于组件,库和工具函数的模块化开发

什么是模块:
一个Vue项目就像一个大房子,里面有很多房间(文件)。每个房间都有自己的家具和装饰(代码)。模块就是一个这样的房间,它包含了一些特定的功能或数据,比如一个组件、一个工具函数或者一个库

为什么需要import和export
有时候,你想从一个房间(模块)里拿点东西到另一个房间去用,比如你想用另一个组件里的一个方法。这时候,你就需要用到import和export了。export就像是把东西放在房间门口,让其他人可以拿走;import就像是去别人门口拿东西回来用

export的用法
当你有一个函数、一个变量或者一个类,你想让其他模块也能用到它,你就可以用export来导出它

// utils.js
export function add(a, b) {
  return a + b;
}

export const pi = 3.14;

import的用法
当你想要使用其他模块导出的功能或数据时,你就需要用import来导入它们

// App.vue
<script>
import { add } from './utils.js';

export default {
  name: 'App',
  mounted() {
    console.log(add(2, 3)); // 输出: 5
  }
}
</script>

在这个例子中,我们从utils.js模块导入了add函数,并在App.vue组件的mounted钩子中使用了它

默认导出
除了上面这种导出多个成员的方式,你还可以使用默认导出(default export)来导出一个模块的主要功能或数据。每个模块只能有一个默认导出

// myComponent.vue
<template>
  <div>Hello, World!</div>
</template>

<script>
export default {
  name: 'MyComponent'
}
</script>

导入默认导出时,你可以给它起任何名字

// App.vue
<script>
import MyComponent from './myComponent.vue';

export default {
  name: 'App',
  components: {
    MyComponent
  }
}
</script>

总结:import和export 让你可以在Vue 3项目中方便地共享代码和功能。通过export,你可以把模块中的功能或数据导出给其他模块使用;通过import,你可以从其他模块导入你需要的功能或数据

4.组件

什么是组件

想象你搭乐高,‌组件就是一块积木‌。
比如微信的「朋友圈」界面:

点赞按钮是一个组件
评论输入框是另一个组件
整个朋友圈列表又是一个大组件
‌好处‌:哪里需要哪里搬,不用重复造轮子

‌为什么用组件?‌
‌场景1‌:你写了 10 个页面都有「登录按钮」,改颜色要改10次 → ‌直接改组件,一次搞定‌
‌场景2‌:老板要加个「分享到微博」功能 → ‌直接拿现成的分享组件改改就能用‌
‌场景3‌:同事看不懂你的代码 → ‌拆成组件,像看说明书一样清晰

组件示例(按钮组件):

<!-- Button.vue -->
<!-- 模板:组件的HTML结构 -->
<template>
  <button class="my-btn" @click="handleClick">
    {{ buttonText }}
  </button>
</template>

<!-- 逻辑:组件的行为 -->
<script>
export default {
  props: { // 接收父组件传过来的参数(像函数参数)
    buttonText: {
      type: String,
      default: '点我'
    }
  },
  methods: {
    handleClick() {
      this.$emit('btn-click') // 触发自定义事件(告诉父组件我被点了)
    }
  }
}
</script>

<!-- 样式:只作用于当前组件 -->
<style scoped>
.my-btn {
  background: pink;
  padding: 10px 20px;
}
</style>

在父组件里使用该组件示例:

<template>
  <div>
    <!-- 像用普通HTML标签一样使用 -->
    <Button 
      button-text="提交订单" 
      @btn-click="onButtonClick" 
    />
  </div>
</template>

<script>
import Button from './Button.vue' // 导入积木

export default {
  components: { Button }, // 声明要用这个积木
  methods: {
    onButtonClick() {
      console.log('按钮被点了!')
    }
  }
}
</script>

核心概念:

  • ‌props‌ → 父组件给子组件传参数(就像妈妈给你带饭盒)
  • ‌$emit‌ → 子组件给父组件发消息(就像你打电话喊妈回家)
  • scoped style‌ → 组件样式不污染别人(你的纹身不影响隔壁老王) ‌
  • 组件复用‌ →同一把钥匙开多扇门(不用每扇门都造新钥匙,不用每个页面都写同样的样式按钮代码)

实际开发步骤:

  • ‌拆组件‌:看到一个页面重复 3 次的部分 → 拆!
  • ‌定 props‌:想清楚这个组件需要别人传什么参数
  • ‌抛事件‌:想清楚这个组件要通知别人什么事
  • ‌写文档‌:告诉队友这个组件怎么用(参数说明、事件说明)

如你要做购物车,可以拆成:

  • 商品卡片组件(显示图片、价格)
  • 数量选择器组件(加减按钮)
  • 总价计算组件(自动算钱)

‌每个组件各司其职,组合起来就是完整功能!

5. <script setup><script>对比

‌<script>‌:传统写法,像写“说明书”一样分模块(data、methods、props…)。代码量‌ 较多(需要写export default结构)
<script setup>‌:Vue 3 的“懒人语法糖”,所有代码直接写在顶层,更简洁,但需要适应新规则。代码量极少

<script setup> ‌本质是编译时的语法糖‌,最终会转换成普通<script>
<script setup>中,‌顶层变量自动暴露给模板‌,但用ref时记得.value(在模板中会自动解包)。
新项目无脑用<script setup>,老项目慢慢过渡;想少写代码用 <script setup>,强迫症分模块用 <script>

写法对比:
在这里插入图片描述

差异对比:
在这里插入图片描述
在 Vue 3 的<script setup> 语法糖中,你不能通过 export default { props: {} } 的方式来定义 props。这是因为

<script setup> 中,你应该使用 defineProps、defineEmits 和 withDefaults 等函数来定义 props、emits 和带有默认值的 props。这些函数是在编译时由 Vue 处理的,它们允许你在 <script setup> 中直接使用这些定义,而不需要将它们嵌套在 export default 对象中

<script setup> 中,你不需要导出对象,而是直接编写组合式 API 函数(如 ref、reactive、computed 等)和生命周期钩子。Vue 会自动处理这些函数的注册和暴露

6. setup函数

在 Vue 3 中,setup 函数是一个新的组件选项,它是组合式 API(Composition API)的入口点。setup 函数在组件创建之前被调用,并且在 beforeCreate 和 created 生命周期钩子之前执行。它接收两个参数:props 和 context

props:
props 是一个包含组件外部传入的所有 props 的对象。这些 props 是在组件的

context:
context 是一个普通的 JavaScript 对象,它暴露了三个组件的实例属性:attrs、slots 和 emit
attrs 包含了父作用域中不作为 prop 被识别(且没有通过 v-bind=“$attrs” 传入内部组件)的特性绑定(attribute bindings)。
slots 是包含所有插槽内容的对象
emit 是一个函数,用于触发当前组件上的自定义事件。它接受一个事件名作为字符串,以及可选的附加参数,这些参数将作为事件数据传递给监听器

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  },
  setup(props, context) {
    // 直接访问 props
    console.log(props.message);

    // 使用 context 触发事件
    context.emit('custom-event', 'Some data');

    // 返回一个对象,其中的属性和方法可以在模板中使用
    return {
      // 你可以在这里定义新的响应式数据或方法
    };
  }
};
</script>

<script setup> 语法糖中,你不需要显式地调用 setup 函数,因为 Vue 会自动处理。相反,你可以直接使用 defineProps 和 defineEmits 函数来分别定义 props 和 emit 事件,并且所有顶层的响应式引用和计算属性都会自动暴露给模板

注意:
setup 函数是 Vue 3 中引入的,不适用于 Vue 2
在 setup 函数中,你不能使用 this 关键字来访问组件实例,因为 setup 在组件实例被创建之前执行
setup 函数是可选的,但如果你打算使用组合式 API,那么通常会用到它

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32---FreeRTOS中断管理试验

一、实验 实验目的&#xff1a;学会使用FreeRTOS的中断管理 创建两个定时器&#xff0c;一个优先级为4&#xff0c;另一个优先级为6&#xff1b;注意&#xff1a;系统所管理的优先级范围 &#xff1a;5~15 现象&#xff1a;两个定时器每1s&#xff0c;打印一段字符串&#x…

数据结构知识学习小结

一、动态内存分配基本步骤 1、内存分配简单示例&#xff1a; 个人对于示例的理解&#xff1a; 定义一个整型的指针变量p&#xff08;着重认为它是一个“变量”我觉得可能会更好理解&#xff09;&#xff0c;这个变量用来存地址的&#xff0c;而不是“值”&#xff0c;malloc函…

swift4-汇编分析枚举内存布局

一、枚举的内存原理 1.1 常规case enum TestEnum { case test1, test2, test3 } var t TestEnum.test1 t .test2 t .test3枚举是常规的case的情况-是采取一个字节来存枚举变量通过拿到枚举的内存地址&#xff0c;看地址里面存的枚举值情况窥探枚举内存存储情况 var t Te…

Anolis服务器Arm64架构服务器配置(其他版本服务器解决方式思路一质)

Anolis服务器Arm64架构服务器配置 1.nginx配置1.1.尝试安装nginx1.2.资源准备1.2.1.查看服务器系统版本:1.2.2.下载依赖包:1.3.正式安装nginx1.3.1.下载nginx并上传服务器1.3.2.开始安装nginx1.4.防火墙配置1.4.1.直接关闭防火墙:不推荐,但省事1.4.2.命令介绍1.4.3.配置开启…

threejs:着色器onBeforeCompile给导入的模型添加光带扫描效果

模型材质属性丢失 上一篇博客我们学习了用着色器给模型添加光带扫描效果&#xff0c;今天来学习给导入的模型添加光带扫描效果&#xff0c;目标是给如下图的立筒仓加光带扫描。 首先我们试试原来的方法还是否有效。 import * as THREE from three;// 引入gltf模型加载库GLTFL…

MySQL零基础教程16—表连接进阶

复习表别名 之前已经学习过&#xff0c;查询的时候可以使用as来对检索的列进行重命名&#xff0c;这样可以让sql更加简介&#xff0c;增强易读性&#xff08;as可以省略&#xff09; 此外&#xff0c;使用表别名还可以支持在一条select语句中&#xff0c;一个表是被多次使用 …

K8s控制器Deployment详解

回顾 ReplicaSet 控制器,该控制器是用来维护集群中运行的 Pod 数量的&#xff0c;但是往往在实际操作的时候&#xff0c;我们反而不会去直接使用 RS&#xff0c;而是会使用更上层的控制器&#xff0c;比如说 Deployment。 Deployment 一个非常重要的功能就是实现了 Pod 的滚动…

rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流

1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调

文章目录 2.7 QAM 调制 / 解调2.7.1 概述2.7.2 星座图星座图的结构与性能发射端的信息编码与接收端的解码差分编码的分类与实现差分编码的模4格雷加法器公式16QAM星座图与映射关系 2.7.3 信号表达式正交振幅调制的基本原理与系统分析相位误差对QAM性能的影响多电平正交振幅调制…

idea生成自定义Maven原型(archetype)项目工程模板

一、什么是Maven原型&#xff08;Maven archetype&#xff09; 引自官网的介绍如下&#xff1a; Maven原型插件官网地址 这里采用DeepSeek助手翻译如下&#xff1a; Maven 原型 什么是原型&#xff1f; 简而言之&#xff0c;原型是一个 Maven 项目模板工具包。原型被定义为一…

决策树(Decision Tree)基础知识

目录 一、回忆1、*机器学习的三要素&#xff1a;1&#xff09;*函数族2&#xff09;*目标函数2.1&#xff09;*模型的其他复杂度参数 3&#xff09;*优化算法 2、*前处理/后处理1&#xff09;前处理&#xff1a;特征工程2&#xff09;后处理&#xff1a;模型选择和模型评估 3、…

Python学习(十四)pandas库入门手册

目录 一、安装与导入二、核心数据结构2.1 Series 类型&#xff08;一维数组&#xff09;2.2 DataFrame 类型&#xff08;二维数组&#xff09; 三、数据读取与写入3.1 读取 CSV 和 Excel 文件3.2 写入数据 四、数据清洗与处理4.1 处理缺失值4.2 数据筛选4.3 数据排序 五、数据分…

通过计费集成和警报监控 Elasticsearch Service 成本

作者&#xff1a;来自 Elastic Alexis Charveriat 使用 Elasticsearch 服务计费集成来跟踪、定制和提醒 Elasticsearch 服务费用。 监控和管理你的Elasticsearch服务&#xff08;ESS&#xff09;使用情况和成本对高效运营至关重要。 Elasticsearch服务计费集成提供了一种简化的…

cmake、CMakeLists.txt、make、ninja

文章目录 一、概念0.cmake官网1.什么是cmake2.为什么使用cmake3.CMakeLists.txt 二、CMakeLists.txt语法&#xff1a;如何编写CMakeLists.txt&#xff0c;语法详解(0)语法基本原则(1)project关键字(2)set关键字(3)message关键字(4)add_executable关键字(5)add_subdirectory关键…

DeepSeek本地接口调用(Ollama)

前言 上篇博文&#xff0c;我们通过Ollama搭建了本地的DeepSeek模型&#xff0c;本文主要是方便开发人员&#xff0c;如何通过代码或工具&#xff0c;通过API接口调用本地deepSeek模型 前文&#xff1a;DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注&#xff1a;本文不仅…

前端基础之浏览器本地存储

如我们在一些网站中&#xff0c;去进行数据搜索&#xff0c;在浏览器中是有一个对于的存储的&#xff0c;并且我们可以去手动进行value的增删操作 LocalStroage的使用 并且将浏览器关闭之后&#xff0c;数据也会保存&#xff0c;除非用户手动清理数据或是清空缓存 <!DOCTYPE…

2025 聚合易支付完整版PHP网站源码

源码介绍 2025 聚合易支付完整版PHP网站源码 PHP版本&#xff1a;PHP74 源码上传服务器&#xff0c;解压访问域名即可安装 安装完成后一定要设置伪静态 源码里面nginx.txt 就是伪静态 然后复制粘贴到伪静态里面保存即可 部分截图 源码获取 2025 聚合易支付完整版PHP网站源码…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

easyExcel使用案例有代码

easyExcel 入门,完成web的excel文件创建和导出 easyExcel官网 EasyExcel 的主要特点如下&#xff1a; 1、高性能&#xff1a;EasyExcel 采用了异步导入导出的方式&#xff0c;并且底层使用 NIO 技术实现&#xff0c;使得其在导入导出大数据量时的性能非常高效。 2、易于使…

NVIDIA(英伟达) GPU 芯片架构发展史

GPU 性能的关键参数 CUDA 核心数量&#xff08;个&#xff09;&#xff1a;决定了 GPU 并行处理能力&#xff0c;在 AI 等并行计算类业务下&#xff0c;CUDA 核心越多性能越好。 显存容量&#xff08;GB&#xff09;&#xff1a;决定了 GPU 加载数据量的大小&#xff0c;在 AI…