vue3 Props的用法(父传子)

vue3父子组件间传参通信 本文主要是记录Vue3在setup语法糖下的父子组件间通信的四种方式。 阅读详情
AI摘要

本文详细介绍了Vue3中Props的使用方法,包括父组件如何向子组件传递数据、Props的声明方式、类型检查、默认值设置及实战案例。

在 Vue 3 中,Props(属性)用于在组件之间传递数据。

vue官网 Props

Props的作用

  1. 传参:Props 允许父组件向子组件传递数据。
  2. 类型检查:Vue 允许在定义 Props 时指定数据的类型,这有助于在开发过程中进行类型检查,提前发现潜在的类型错误。
  3. 设置默认值:可以为 Props 设置默认值。当父组件没有传递该 Prop 时,子组件会使用默认值进行渲染。

Vue 中的 Props 遵循单向数据流原则,即父组件向子组件传递数据,子组件不能直接修改父组件传递过来的 Prop。

父组件传值给子组件

在父组件的模板中,可以使用属性绑定的方式将数据传递给子组件(静态传值):

<ChildComponent title="哈嘿" />

可以使用变量或表达式来动态地传递 Props:

<!-- 根据一个变量的值动态传入 -->
<ChildComponent :title="title" />
 
<!-- 根据一个更复杂表达式的值动态传入 -->
<ChildComponent :title="someCondition ? titleA : titleB" />

可以使用 v-bind 动态绑定所有的 props:
可以将一个对象传递给 v-bind,这个对象的属性将被用作组件的 props。

<template>
  <ChildComponent v-bind="obj" />
</template>

<script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
import { reactive } from 'vue'
let obj = reactive({
  message: 'Hello',
  count: 5
})
</script>

<ChildComponent v-bind="obj" /> 等价于:

<ChildComponent :message="message" :count="count" />

声明 Props

  1. 使用 defineProps 函数:
    • 在 <script setup> 语法中,可以直接使用 defineProps 函数来声明组件接收的 Props。
    • 在 Vue 3 中,基于类型的声明通常用于组合式 API 。
<script setup lang="ts">
import { defineProps } from 'vue';

// 字符串数组形式
const props = defineProps(['message', 'count']);
</script>

在这个例子中,声明了两个 Props:message 和count 。

可以使用对象字面量的方式来声明 Props:

<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  message: String,
  count: Number,
});
</script>

在这个例子中,声明了两个 Props:message 是字符串类型,count 是数字类型。通过类型注解,TypeScript 可以在开发过程中进行类型检查,确保传入的 props 值符合预期的类型。

在 <script setup> 语法中,使用 defineProps 函数结合类型注解来进行基于类型的声明。
如果项目没有使用 TypeScript,就无法使用基于类型的声明进行声明。
基于类型的声明可以在开发过程中利用 TypeScript 的类型检查机制,提前发现类型错误。

  1. 在选项式 API 中(没有使用 <script setup> 语法糖),props 是通过 props 选项进行声明的。
    • 必须要用props选项声明组件接收的Props,在setup()的props参数里,才有Props数据。
    • 在 Vue 3 中,运行时声明通常用于选项式 API。
export default {
  props: ['message'],
  setup(props) {
    // setup() 接收 props 作为第一个参数
    console.log(props.message)
  }
}

必须要用props选项声明组件接收的Props。如果没有 props: ['message']:

export default {
  setup(props) {
    // 报错: 类型“LooseRequired<{} & {}>”上不存在属性“message”。
    console.log(props.message)  
  }
}

通过在组件选项对象中直接定义 props 属性来进行运行时声明:

export default {
  props: {
    message: String,
    count: Number,
  },
  setup() {}
  // 组件的其他选项和逻辑
};

在这个例子中,message 被声明为字符串类型的 Prop,count 被声明为数字类型的 Prop。这种方式在运行时,Vue 会根据声明的类型对传入的 Props 进行验证。

运行时声明通常在不需要进行严格类型检查或者需要更灵活地处理 Props 的情况下使用。它主要依赖于 Vue 的运行时机制来处理 Props 的传递和验证。

传递给 defineProps() 的参数和提供给 props 选项的值是相同的,本质上都是在使用 prop 选项。

Props 的验证

Props 验证的主要目的是确保组件接收到的数据符合预期的格式和类型。

类型验证

  • 可以指定 Props 的类型,如 String、Number、Boolean、Array、Object 等。
  • 也可以是函数类型 Function 、自定义类型。
<script setup lang="ts">
import { defineProps } from 'vue';
// 定义一个接口作为自定义类型
interface MyCustomType{
  property1: string;
  property2: number;
}
const props = defineProps({
  name: String,
  age: Number,
  hobbies: Array,
  address: Object,
  customType: MyCustomType, // 自定义类型
  onButtonClick: Function   // 函数类型
});
</script>

确保父组件传递给子组件的Props值与声明的类型一致,避免类型错误。

必需性

- 可以指定 Props 是否为必需,如果为必需,则必须在父组件中传入。
<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  message: {
    type: String,
    required: true
  }
});
</script>

在这个例子中,message 是必需的 Prop,如果父组件没有传递 message ,则会抛出警告。

自定义验证

- 可以使用 validator 函数进行自定义验证。
<script setup lang="ts">
import { defineProps } from "vue";

let props = defineProps({
  b: {
    type: Number,
    validator: (value: number) => {
      return value >= 0; // 自定义验证,确保宽度非负
    }
  }
})
console.log(props)
</script>

在这个例子中,b 使用了自定义验证函数,确保b 的值不为负数。
在父组件传入b = -10,浏览器控制台输出警告:
在这里插入图片描述

默认值

可以为 Props 设置默认值,当父组件没有传递该 Prop 时,子组件会使用默认值进行渲染。

<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  message: {
    type: String,
    default: 'Hello, Vue 3!',
  },
  count: {
    type: Number,
    default: 0,
  },
});
</script>

在这个例子中,message 的默认值为 'Hello, Vue 3!',count 的默认值为 0。

withDefaults

在 Vue 3 中,withDefaults 是一个用于为 defineProps 定义的 props 设置默认值的函数。

withDefaults 参数说明:

  • withDefaults 的第一个参数是 defineProps 的返回值,它表示组件接收的 props 对象。
  • 第二个参数是一个对象,其中的键对应于 props 的名称,值是相应的默认值。
    • 默认值是通过函数返回的。

假设有一个组件,定义了一些 props,并且希望为其中一些 props 设置默认值:

<template>
  <div>{{ props.message }}</div>
  <div>{{ props.count }}</div>
</template>
<script setup lang="ts">
import { defineProps, withDefaults } from 'vue';

// 定义了一个接口 PropsInter  来描述组件的 props 结构
interface PropsInter {
  message: string;
  count: number;
  obj: { a: number; b: number; };
  arr: string[];
}

const props = withDefaults(defineProps<PropsInter>(), {
  message: 'Hello, Vue 3!',
  count: 0,
  obj: () => {
  	return { a: 10, b: 5 }
  },
  arr: () => return [ 'item1', 'item2' ]
});
</script>

Boolean 类型转换

当声明为 Boolean 类型的 props 时,有特别的类型转换规则,以便更贴近原生的 boolean attributes 的行为。

  • 当一个 prop 明确被声明为布尔类型时,真值会被转换为 true,假值会被转换为 false:
    • 当父组件传递一个真值(如 true、字符串 "true"、数字 1 等)时,该 prop 将被转换为 true。
    • 当父组件传递一个假值(如 false、字符串 "false"、数字 0、空字符串 ""、null、undefined 等)时,该 prop 将被转换为 false。

在子组件中:

defineProps({
  disabled: Boolean
})

在父组件中:

<!-- 等同于传入 :disabled="true" -->
<MyComponent disabled />
 
<!-- 等同于传入 :disabled="false" -->
<MyComponent />
  • 当一个 prop 被声明为允许多种类型时,声明顺序会影响 Boolean 转换规则是否适用:
    • 当同时允许字符串和布尔类型时,如果布尔类型出现在字符串类型之前,Boolean 转换规则才适用。
const props = defineProps({
  myProp: [Boolean, String],
});

如果父组件传递 "true",这个值将被转换为布尔值 true。如果传递 "false",将被转换为布尔值 false。其他字符串值将保持为字符串。
但是,如果声明顺序是 [String, Boolean],那么 "true" 和 "false" 将被视为字符串,而不会进行布尔类型的转换。

这种边缘情况可能会导致在不同的声明顺序下,相同的输入值被解释为不同的类型。

使用 Props

在父组件的模板中传值给子组件:

<ChildComponent title="哈嘿" />

在子组件的模板中,可以直接使用定义的 Props:

<template>
  <div>{{ title }}</div>
</template>
<script setup lang="ts" name="ChildComponent">
import { defineProps } from "vue";
defineProps(['title'])

// console.log(title)  // 报错:找不到名称“title”。
</script>

在模板中,可以直接使用title。
console.log(title) 报错:找不到名称“title”。
这是因为title 并没有被直接声明为一个可用的变量。

在 Vue 3 的 <script setup> 中,defineProps 的返回值是一个包含传入的 props 的对象。

如果想要在组件中使用 title ,需要通过defineProps的返回值来读取:

<template>
  <div>{{ props.title }}</div>
</template>
<script setup lang="ts" name="ChildComponent">
import { defineProps } from "vue";
// 只接收title属性
let props = defineProps(['title'])

console.log(props)

if(props.title) {
  console.log(props.title)
}
</script>

defineProps 返回一个对象 props,props 对象中包含了 title 属性,可以通过 props.title 的方式来访问和使用这个 prop 的值。
在这里插入图片描述

defineProps 的返回值是一个包含组件接收的 props 的只读对象:

  • 返回的 props 对象是只读的。
  • 返回的 props 对象包含了组件所有接收的东西:父组件传递给当前组件的所有被组件明确声明为 props 的属性。
    • 必须在defineProps中显式的接收父组件传递的属性。假如父组件传了几个属性,比如<ChildComponent title="哈嘿" id="id12345" />,子组件defineProps(['title'])只接收title属性,不会接收id属性。
  • 在组件内部不能直接修改 props 对象的属性值。

实战演练

在types/index.ts定义一个PersonInter接口:

// 定义一个接口,用于限制对象的具体属性
// 接口在 TypeScript 中用于定义一种契约,确保实现该接口的对象都具有相同的结构。
export interface PersonInter {
  id: string;
  name: string;
  age: number;
}

在父组件有一个person传递给子组件:

<template>
  <div>
    <ChildComponent :personList="personList" />
  </div>
</template>

<script setup lang="ts" name="Person">
// 在 TypeScript 中,import type 语法用于仅导入类型信息而不导入实际的值或函数。
// 使用 import type 导入的类型信息仅在类型检查时使用,不会在运行时产生任何影响。
import type { PersonInter } from '@/types';

import { reactive } from 'vue';
import ChildComponent from './ChildComponent.vue';
let personList = reactive<PersonInter>({
  id: 'person001',
  name: 'John',
  age: 18
});
</script>

子组件:

<template>
  <div>{{ person.name }}</div>
</template>
<script setup lang="ts" name="ChildComponent">
import type { PersonInter } from '@/types';
import { defineProps } from "vue";

// 只接收person
let props = defineProps(['person'])
console.log(props)

// 接收person+类型限制
let props = defineProps<{ person: PersonInter }>()

// 接收person+类型限制+限制必要性+默认值
// ?表示不必传,父组件可传可不传,如果父组件不传,则使用默认值
// 指定默认值需要使用withDefaults
withDefaults(defineProps<{ person?: PersonInter }>(), {
  person: () => {
    return { id: 'person000', name: 'Alice', age: 18 }
  }
})

</script>
  • let props = defineProps(['person']) 只接收person,对person没有任何限制。父组件可以给person赋任意类型的值。
  • defineProps<{ person: PersonInter }>(): 通过泛型参数指定了 props 的结构。具体来说,定义了一个名为 person 的 prop,其类型为 PersonInter。
  • defineProps<{ person?: PersonInter }>():
    • 使用泛型参数指定了 props 的结构。定义了一个名为 person 的 prop,其类型为 PersonInter。
    • 后面的问号 ? 表示这个 prop 是可选的,即父组件可以选择是否传递这个 prop。
Vue 3中如何使用props向子组件传递数据 在 Vue 应用程序中设置道具后,您可以在组件内部使用它们,就好像数据是在同一组件内部定义的一样。在上面的代码中,我们使用指令绑定,这是脚本部分中数据对象数组的名称,以及您在上面部分中设置的测试组件中的道具名称。假设您有一个数据对象,您希望以两种不同的方式在两个不同的组件中显示它,例如,Billboard Top 10 Artists 列表。要在组件中接收道具,您必须指定要在该组件内部接收的道具。进入两个测试组件内部,您的第一直觉可能是创建这两个独立的组件,将数组添加到数据对象中,然后将它们显示在模板中。 阅读详情

相关推荐

Vue3组件通信:Props & Emits 详解

- 父组件 -->-- 子组件 --></script>单向数据流Props 向下,Events 向上不要直接修改 Props明确接口为 Props 和 Emits 定义清晰的类型添加必要的验证逻辑适度抽象当 Props 超过 5 个时考虑重构组件复杂通信使用状态管理(Pinia)性能优化大对象 Props 使用shallowRef频繁变化的 Props 考虑防抖文档化## 组件 API### Props| 名称 | 类型 | 默认值 | 说明 |

monk all the way 996

详细分析Vue3中的props用法(父传子)

在 Vue 3 中,父组件可以通过 props 向子组件传递数据 子组件通过 defineProps 或 props 来定义它接收的属性 这些属性在子组件中可以直接使用

码农研究僧的博客 3万+

Vue3里通过defineProps和defineEmits两个宏函数进行父子组件传递数据

vue3父子组件通信,vue3里props使用,vue3里emit使用

qq_37635012的博客 5992

Vue3:父组件向子组件传值(Props)

Vue3:父组件向子组件传值(Props)

无面人的博客 5078

从零到一:ArduPilot无人船PID调参实战指南

本文详细介绍了ArduPilot无人船PID调参的实战指南,从基础参数设定到高级调参技术,帮助用户掌握水面环境下的PID控制逻辑。通过案例分析和参数示例,解决无人船在空载、负载变化及不同水域环境中的航行问题,提升无人船的稳定性和精确度。

weixin_29266647的博客 507

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 295

Vue3.5正式上线,父传子props用法更丝滑

Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性说一下props的两个小改动使我们日常使用更加灵活。

xuxian的博客 1091

别再纠结选哪个向量库了!我用Spring AI + Redis Stack 7.2,5分钟搞定企业知识库RAG原型

本文介绍了如何利用Spring AI和Redis Stack 7.2快速构建企业级RAG应用,解决向量数据库选型难题。Redis Stack 7.2集成了RediSearch模块,支持向量相似性搜索,具备高性能、低成本、零学习成本等优势,特别适合中小团队快速搭建知识库系统。通过实战代码示例,展示了从环境准备到核心功能实现的完整流程。

weixin_29061041的博客 270

Vue3.5正式上线,父传子props用法更丝滑简洁

Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性说一下props的两个小改动使我们日常使用更加灵活。这次更新其实props的本质功能并没有改变,但写法确实变的更加丝滑好用了,props使用非常高频感觉还是有必要跟进这种更简洁的写法。

csdn_wzq的博客 1192

论文记录:Affine Formation Maneuver Control of Multiagent Systems

多智能体编队控制仿真记录 实现功能:平移/旋转/尺寸缩放/shear,见截图 注意:本仿真图只是起到了演示效果,中间过程速度产生突变,实际中是不允许的。需要进行速度规划,这一点论文中仿真图更为贴合实际。 参考论文:Zhao, S. (2018). Affine Formation Maneuver Control of Multiagent Systems. IEEE Transactions on Automatic Control, 63(12), 4140–4155. 突然发现有个博主写得很好,参考:

W1H1J1的博客 2108

Codex 100个真实案例 - 用AI自动生成API测试用例(接口测试全覆盖)

API 测试是保障后端质量的关键环节,但手写测试用例既枯燥又容易遗漏。本案例将展示如何用 Codex 从 Swagger/OpenAPI 规范文档自动生成 pytest 测试用例——包括正常流程测试、边界值测试、异常参数测试、性能压力测试,还能自动生成 Mock 数据和精美的 HTML 测试报告。全程自然语言驱动,让 API 测试覆盖率从 0 飙到 90%+!

yueyeguzhuo的专栏 270

vue3组件的props(父传子)、emits(子传父)的用法

父组件 parent.vue <template> <!-- 引入子组件 自定义了parentsEmit方法和pData属性--> <children @parentsEmit="pEmitData" :pData="pData"></children> 我是父组件 我是子组件传过来:{{num}} </template> <script> import { ref } from 'vue' setu

qq_55576151的博客 2060

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

MCTP 是由 DMTF(Distributed Management Task Force)定义的协议,用于提供设备和主机间基于不同传输层(如 PCIe、I²C、USB 等)的管理消息通信能力。在 PCIe 环境下,MCTP 消息作为的一种特殊形式传输,并被赋予唯一的 VDM Code 值0000b,以区别于其他 VDM。MCTP 在 PCIe 环境中作为一种基于 Type 1 VDM 的管理通信协议,提供了设备与主机之间的灵活数据传输能力。

CodingCos的博客 2127

详细分析 Vue3 中的 props 用法,Vue 中页面之间的传值方法有哪些?

在Vue3的开发中,props是父组件与子组件之间通信的核心机制,主要用于父组件向子组件传递数据。虽然看起来简单,但props在实际项目中涉及多种场景和细节。本文将从基础到进阶,详细讲解props的使用方法,并提供代码示例和实战案例,帮助小白开发者轻松上手 Vue3 的props。props本文从基础到进阶,详细讲解了 Vue3 中props的用法。通过这些示例,相信你已经对props的功能和使用场景有了全面了解。无论是简单传值还是复杂传递,都可以使用props轻松实现父组件与子组件的数据通信。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1万+

基于STM32设计的电能质量控制系统_353

本项目基于STM32F103RCT6微控制器设计了一套电能质量控制系统,实现了对火焰、烟雾、环境温湿度、电压、电流及功率等多项参数的实时监测与报警。系统通过MQ2烟雾传感器、火焰传感器、SHT30温湿度传感器及电力参数采集模块采集数据,采用高电平触发有源蜂鸣器进行异常报警。采集的数据通过ESP8266无线模块以AP+TCP模式上传至基于Qt开发的手机APP和电脑上位机,实现远程实时监控和历史数据管理。系统配备1.44寸LCD显示屏,实现本地数据显示。软件采用Keil5开发,采用寄存器编程方式,提高系统响应速

253

R语言中5种正态性检验的方法

统计学中的t检验和方差分析等方法的应用条件是样本都来自正态总体或近似正态总体,只有符合这个条件,才能用这些方法来检验各样本所属的总体参数的差异显著性。文本向大家介绍在R语言中检验正态性的几种方法: 1、Kolmogorov-Smirnov检验 K-S检验检验单一样本是否来自某一特定分布。比如检验一组数据是否为正态分布。它的检验方法是以样本数据的累积频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。K-S检验的原假设和备择假设为: H0:样本所来自的总体分布服从

Mrrunsen的博客 2万+

Vue3五种父传子通信的方法(超详细带demo)

方式适用场景特点props父传子数据支持数据类型验证和默认值v-model父子双向绑定适用于表单$refs父调子方法直接操作子组件跨层级传递数据避免props一层层传递Event Bus任意组件通信全局事件监听。

qq_42189524的博客 2733

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

vue3 - 组件间的传值

vue3组件间传值

小白的笔记 1111

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Vue 3 组件通信教程

介绍Vue 3中常见的几种组件通信的使用。

wscfan的博客 1574

Vue 3 组件通信实战系列(一)父子组件通信的标准姿势:Props 与 Emit(含实战与进阶技巧)

Vue 3父子组件通信实战指南:Props与Emit规范用法。文章详细解析了父组件通过Props单向传递数据的类型定义、默认值设置和复杂对象处理技巧,以及子组件通过Emit事件通知父组件的类型安全实现方式。重点介绍了使用TypeScript泛型定义Props和Emit、withDefaults设置默认值、封装通信逻辑等进阶技巧,并总结了单向数据流约束和常见问题解决方案。文章强调类型声明的重要性,推荐组合式API和<script setup>语法,为Vue开发者提供了父子组件通信的完整实践方案。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 888

Vue3组件间通信——父子传值、方法调用

Vue3组件通信之父子组件传值、方法调用

m0_46627407的博客 3448

总结了Vue3的七种组件通信方式,别再说不会组件通信了

前端瓶子君,关注公众号回复算法,加入前端编程面试算法每日一题群写在前面本篇文章是全部采用的 <script setup> 这种组合式API写法,相对于选项式来说,组合式API这...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 252

03.Vue3 组件的概念,组件通信,插槽,动态组件与异步组件

Vue3 探索组件的理念 1. 组件的定义及复用性,局部组件和全局组件 用树来表达一个网页的结构,将一个网页拆成小组件,会更容易维护。 例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。 全局组件 简单实现组件化: <script> const app = Vue.createApp({ template: ` <div> <Hello /> <World /&gt

John是橘红的博客 1012

4.5 vue3 父子传递和v-model

Vue3父子组件通信主要通过props和emit实现。父组件使用props向子组件传递数据,子组件通过defineProps接收;子组件通过defineEmits定义事件,使用emit触发事件向父组件传值。父组件用@事件名监听子组件事件。v-model可实现双向绑定,是:value和@input的语法糖,支持自定义组件和多字段绑定。核心原则是单向数据流,父组件控制数据更新。掌握props和emit是Vue组件通信的基础。

chxii的专栏 1285
上一篇: vue3 语法糖<script setup>
下一篇: vue3 生命周期钩子
fishmemory7sec
博客等级 码龄5年 1165粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值