当前位置: 首页 > news >正文

写日志!运营程序

4.2 父组件逻辑 (App)

父组件负责持有真实的数据源,并定义处理函数来响应子组件的请求。

const { ref } = Vue;

const App = {
components: {
ProductItem // 注册子组件
},
setup() {
// 父组件拥有的数据 (Source of Truth)
const products = ref([
{ id: 1, name: '机械键盘', price: 399 },
{ id: 2, name: '无线鼠标', price: 129 },
{ id: 3, name: '显示器支架', price: 199 }
]);

    const totalPrice = ref(0);const lastAddedItem = ref('');// 处理函数:当接收到子组件的 'add-to-cart' 事件时执行// payload 参数就是子组件 emit 出来的那个对象const handleAddToCart = (payload) => {console.log(`收到通知,商品ID: ${payload.id}, 价格: ${payload.price}`);// 父组件执行修改数据的逻辑totalPrice.value += payload.price;lastAddedItem.value = `刚刚添加了 ID 为 ${payload.id} 的商品`;};return {products,totalPrice,lastAddedItem,handleAddToCart};
}

};

4.3 模板结合 (HTML Usage)

在 HTML 中,我们通过属性绑定 (😃 和事件监听 (@) 将两者连接起来。

http://www.baidu.com/link?url=9WkWJwt4mjF9CWZ9c3Z4YRR9Uy8feU7uJx5U5P0Zbij9tr_W-EvonnlBWdIIWrTA
<div class="header"><h2>商品列表</h2><div class="status-bar"><span class="total-price">购物车总额: ¥{{ totalPrice }}</span><span class="last-log" v-if="lastAddedItem">{{ lastAddedItem }}</span></div>
</div><!-- 核心交互:1. :name="item.name"        -> 数据向下传递 (Props)2. @add-to-cart="handle..." -> 事件向上传递 (Emit)注意:我们把 item.id 既作为 key 使用,也作为 prop 传给子组件
-->
<product-item v-for="item in products" :key="item.id":id="item.id":name="item.name":price="item.price"@add-to-cart="handleAddToCart"

props: {
// 基础类型检查
title: String,

// 必填项
price: {type: Number,required: true
},
http://www.baidu.com/link?url=UK9M1kYPo9nuMx1XaXo4eSngXtmNqc6y19LbKAnD_hBUHfvpc9EzrR5yzqyjJJbKRV8LOHFunrx_607wHRPVtK
// 带有默认值的对象
// 注意:对象或数组的默认值必须从一个工厂函数返回
config: {type: Object,default(rawProps) {return { theme: 'dark' }}
},// 自定义验证函数
status: {type: String,validator(value) {// 这个值必须匹配下列字符串中的一个return ['success', 'warning', 'danger'].includes(value)}
}

}

2.3 命名规范

在 JavaScript 中:使用 camelCase (驼峰命名法),例如 props.productName。

在 HTML 模板中:使用 kebab-case (短横线命名法),例如 。
Vue 会自动处理这两者之间的转换。

  1. Emit:子传父 (Events Up)

既然子组件不能修改 props,那它想改变数据怎么办?(比如用户点击了子组件里的“删除”按钮)。
它必须通知父组件,请求父组件来执行修改。

3.1 触发与监听

触发:子组件使用 $emit('event-name', payload) 抛出一个事件。payload 是可选的参数,用于传递具体的数据。

监听:父组件像监听原生 DOM 事件(如 click)一样,使用 @event-name="handler" 监听这个自定义事件。

3.2 声明 Emits (Vue 3 推荐)

为了让组件的行为更清晰,Vue 3 建议我们在组件中显式声明它会抛出哪些事件。这不仅有助于文档化,还能让 Vue 自动校验事件。

// 声明该组件会触发的事件
emits: ['add-to-cart', 'delete-item'],
// 或者对象语法进行验证
emits: {
'add-to-cart': (id) => {
if (id) return true; // 验证通过
console.warn('add-to-cart 事件缺少 id 参数');
return false;
}
}

  1. 实战案例:购物车计数器

我们将构建一个简单的父子组件系统,演示完整的交互流程。

父组件 (App):维护一个商品列表和总价。它是数据的“单一事实来源”。

子组件 (ProductItem):展示单个商品,并包含“加入购物车”按钮。它只负责展示和通知。

我们将代码逻辑拆解为三个部分:

4.1 子组件逻辑 (ProductItem)

子组件负责声明它需要什么数据 (props),验证这些数据,并在用户交互时发送通知 (emit)。

const ProductItem = {
// 1. 严格的 Props 声明
props: {
id: {
type: Number,
required: true
},
name: {
type: String,
required: true
},
price: {
type: Number,
required: true
}
},
// 2. 声明抛出的事件
emits: ['add-to-cart'],

// setup 函数的第二个参数 context 中包含 emit 方法
setup(props, { emit }) {const notifyParent = () => {// 核心:子组件不直接修改数据,而是发出通知// 我们把商品的 id 和 price 打包发给父组件// 这里的 { id: ..., price: ... } 就是 payloademit('add-to-cart', { id: props.id, price: props.price });};return { notifyParent };
},


http://www.jsqmd.com/news/835342/

相关文章:

  • TRUST Agents
  • 厦门 App 开发优选解析 行业发展现状全面解读 - 软件测评师
  • 北京钢筋混凝土化粪池厂家实力排行及核心维度对比 - 奔跑123
  • 父组件逻辑 (App)
  • 湖南靠谱耐用水处理厂家分析 东隆环保稳居行业优选前列,生活污水处理/锅炉水处理/废水回用水处理,水处理设备哪家有实力 - 品牌推荐师
  • 北京水泥预制检查井厂家排行:合规与实用维度实测 - 奔跑123
  • 讨厌这个地方
  • 2026北京热门办公楼出租推荐榜:北京写字楼招租/北京商务楼 - 元点智创
  • 2026年告别AI检测重复警报:快速降AI工具推荐 - 降AI实验室
  • 歌声转换SVC主流方法原理剖析5 — LATHER-SVC
  • 北京水泥蓄水池厂家排行:核心实力与落地案例对比 - 奔跑123
  • 刚刚发布!无锡黄金回收实测:5家正规店排名 - 天天生活分享日志
  • 2026年呼和浩特市仓库货架厂家权威推荐榜/组合式货架,模块化货架,拆装式货架 - 品牌推广大师
  • API 网关鉴权超时导致请求失败 error code 504 怎么优化?
  • 北京地区水泥预制隔油池供应商综合排行实测分析 - 奔跑123
  • 武汉:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 2026年北京办公室出租优质服务公司最新推荐榜:助力企业精准选址 - 元点智创
  • 5.11 axios的使用
  • 2026省电空气能取暖机靠谱品牌盘点!6大主流头部品牌权威解读,避坑选购一次说清 - 匠言榜单
  • 40.嘉兴报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 无锡黄金回收避坑!实测4家机构,正规渠道这样选更划算 - 天天生活分享日志
  • 南充市场门头招牌|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 2026北京优质写字楼租赁服务商推荐 - 元点智创
  • 西安新希望职业高中官方电话 - 博客湾
  • 第四章指令系统
  • 苏州:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 北京水泥预制化粪池厂家实测评测:全维度性能对比 - 奔跑123
  • 买票
  • 天津靠谱 App 开发服务盘点 本地专业服务商甄选 - 软件测评师
  • 成都奢侈品名表回收门店测评 二手劳力士卡地亚万国积家手表回收行情分享 本地上门回收案例 - 博客湾