通过上一节的学习,我们了解并掌握了组件通信的定义及一般使用。那么接下来,我们将之前练习过的案例使用组件化思想来实现一下吧。

实例:记事本(组件化)

实现功能

运用组件化思想,实现Vue学习:3.V标签综合3(https://blog.csdn.net/weixin_51416826/article/details/137506921?spm=1001.2014.3001.5501)的功能。

思路

首先,将页面拆分为三个独立的组件:TodoHeader、TodoBody和TodoFooter。在src/components/ 目录下注册这三个组件,并分别开发它们的功能。最后,在根组件 App.vue 中引用这些组件,并根据功能需求实现组件间的通信。

代码

根组件(APP.vue)

<template>
<div id="app">
<TodoHeader @AddName="handleAdd"></TodoHeader>
<TodoBody @del="handleDel" :list="list"></TodoBody>
<TodoFooter @clearAll="handleClear" :list="list"></TodoFooter>
</div>
</template> <script>
import TodoHeader from './components/TodoHeader.vue'
import TodoBody from './components/TodoBody.vue'
import TodoFooter from './components/TodoFooter.vue'
export default {
data(){
return{
list:[
{id:1, name:'学Vue'},
{id:2, name:'搞模型'},
{id:3, name:'吃饭睡觉'},
]}
},
components:{
TodoHeader,
TodoBody,
TodoFooter
},
methods:{
handleAdd(newName){
console.log(newName)
this.list.unshift({
id: +new Date(),
name: newName
})
},
handleDel(id){
console.log(id)
this.list = this.list.filter(item => item.id !== id)
},
handleClear(){
// console.log('all2')
this.list = []
}
}
}
</script> <style>
*{
box-sizing: border-box;
}
#app{
width: 400px;
/* height: 600px; */
text-align: center;
margin: 0 auto;
} </style>

TodoHeader组件

<template>
<header>
<h2>记事本</h2>
<div>
<input v-focus @keyup.enter="add" v-model="newName" placeholder="请输入任务">
<button @click="add">添加任务</button>
</div>
</header>
</template> <script>
export default {
data(){
return{
newName: ''
}
},
methods:{
add(){
console.log(this.newName)
this.$emit('AddName',this.newName)
this.newName = ''
}
},
directives:{
// 指令名
focus:{
// 生命周期钩子-inserted:在相应元素插入后生效
inserted(el){
// el:对应元素
// binding:传值
el.focus()
}
}
}
}
</script> <style scoped>
h2{
color: red;
}
div{
/* width: 400px; */
padding: 10px;
background-color: #ffa;
}
input,button{
height: 50px;
}
</style>

注意:在该组件中使用了自定义指令v-focus。Vue 中的自定义指令允许我们直接操作 DOM。这在需要对元素进行底层操作或直接与原生 JavaScript API 交互时非常有用。我们可以使用directive 函数来创建自定义指令。

通常自定义指令注册有两种:全局和局部。全局注册是在main.js里使用Vue.directive('指令名', {逻辑操作}),而局部注册是在需求组件内部使用directive:{指令名: {逻辑操作}}。当使用自定义指令时,只需在相应标签上以添加属性的形式添加“v-指令名”即可。

自定义指令也可以接收参数、绑定值和修饰符。例如:

<template>
<p v-color="'red'">This will be red</p>
</template> <script>
export default {
directive:{
color: {
inserted(el, binding) {
// 根据指令参数修改元素的颜色
el.style.color = binding.value;
}
}
}
}
</script>

TodoBody组件

<template>
<!-- 列表区域 -->
<section>
<ul>
<li v-for="(item,index) in list"
:key="item.id"
@mouseover="handleMouseOver"
@mouseleave="handleMouseLeave">
<span>{{ index + 1 }}.</span><label>{{ item.name }}</label>
<button
v-show="isHovered"
@click="del(item.id)">x</button>
</li>
</ul>
</section>
</template> <script>
export default {
props:{
list:Array
},
data(){
return{
isHovered: false
}
},
methods:{
del(id){
// console.log(id)
this.$emit('del',id)
},
handleMouseOver() {
// 鼠标移入时将 isHovered 设置为 true,使元素显示
this.isHovered = true;
},
handleMouseLeave() {
// 鼠标移出时将 isHovered 设置为 false,使元素隐藏
this.isHovered = false;
}
}
}
</script> <style scoped>
section{
background-color: #ffd;
text-align: left;
position: relative;
margin-top: -20px;
}
ul{
list-style: none;;
}
li{
height: 50px;
}
button{
width: 50px;
border: none;
background-color: #ffd;
position: absolute;
right:20px; }
</style>

TodoFooter组件

<template>
<!-- 统计和清空 当任务数为0时,不显示-->
<footer>
<span>合计:{{ list.length }}</span>
<button @click="del_all">清空任务</button>
</footer>
</template> <script>
export default {
props:{
list:Array
},
methods:{
del_all(){
// console.log('all1')
this.$emit('clearAll')
}
}
}
</script> <style scoped>
footer{
background-color: #ffd;
position: relative;
margin-top: -20px;
}
span{
position: absolute;
left: 10px;
}
button{
background-color: #aab;
border: none;
position: absolute;
right: 20px;
}
</style>

效果展示

Vue学习:17.组件通信案例-记事本的更多相关文章

  1. 浅谈vue学习之组件通信

    vue用组件化简化了我们编写代码的复杂度,组件之间经常会出现数据传递的情况,那么组件之间是怎样通信的呢? 使用props传递数据 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内 ...

  2. Vue学习笔记-组件通信-子传父(自定义事件)

    props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...

  3. Vue学习笔记-父子通信案例

    <div id="app"> <cpn :number1="num1" :number2="num2" @num1chan ...

  4. Vue学习笔记-组件通信-父传子(props中的驼峰标识)

    在组件中,使用选项props来声明需要从父级接收到的数据.props的值有两种方式:方式一:字符串数组,数组中的字符串就是传递时的名称.方式二:对象,对象可以设置传递时的类型,也可以设置默认值等. & ...

  5. Vue 非父子组件通信方案

    Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...

  6. Vue的父子组件通信(转载)

    Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子父组件通信的问题 首先我们先搭好开发环境,我们首先得装好git和npm这两个工具(如果有不清楚的同学 ...

  7. vue任意关系组件通信与跨组件监听状态 vue-communication

    大家好!我是木瓜太香! 众所周知,组件式开发方式给我们带来了方便,不过也引入了新的问题,组件之间的数据就像被一道无形的墙隔开,如果我们希望临时让两个组件直接通信,vuex 太巨,而 $emit 又不好 ...

  8. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

  9. vue子父组件通信

    之前在用vue写子父组件通信的时候,老是遇到问题!!! 子组件传值给父组件: 子组件:通过emit方法给父组件传值,这里的upparent是父组件要定义的方法 模板: <div v-on:cli ...

  10. vue学习之组件

    组件从注册方式分为全局组件和局部组件. 从功能类型又可以分为偏视图表现的(presentational)和偏逻辑的(动态生成dom),推荐在前者中使用模板,在后者中使用 JSX 或渲染函数动态生成组件 ...

随机推荐

  1. IOT设备连接上云

    如何让我的设备连接上云?参考如下路径. 云 [![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/974556/1 ...

  2. 一套 SQL 搞定数据仓库?Flink有了新尝试

    数据仓库是公司数据发展到一定规模后必然需要提供的一种基础服务,也是"数据智能"建设的基础环节.迅速获取数据反馈不仅有利于改善产品及用户体验,更有利于公司的科学决策,因此获取数据的实 ...

  3. 基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS

    简介: 本文整理自阿里云容器技术专家.OAM 规范主要制定者之一.KubeVela 作者和负责人孙健波(天元)在阿里云开发者社区"周二开源日"的直播分享,将剖析当前 Kuberne ...

  4. [K8s] Kubernetes核心基础概念 Node, Pod, ReplicaSet, Deployment, Service, Ingress, ConfigMap

    Node 即 Kubernetes 集群中的一台工作机器,物理机或者虚拟机. https://kubernetes.io/zh/docs/concepts/architecture/nodes/ 通常 ...

  5. WPF 关于将 ManipulationDeltaEventArgs 的 Manipulators 属性返回值修改为 ReadOnlyCollection 类型的提议

    这是一个 WPF 框架的 API 变更提议,记录一下博客 讨论的地方是: How about change the type of ManipulationDeltaEventArgs.Manipul ...

  6. Ubuntu VNC 远程桌面及常见问题

    一.Ubuntu 远程桌面开启 在ubuntu 设置中打开远程桌面 **注意:如果没有共享桌面选项也不要谎,只需要安装 vino 即可 sudo apt update sudo apt install ...

  7. 数字电路中的等效电路和FPGA中的等效电路

    欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 本篇内容主要 ...

  8. Python 潮流周刊#48:Python 3.14 的发布计划

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  9. 微软开源 MS-DOS「GitHub 热点速览」

    上周又是被「大模型」霸榜的一周,各种 AI.LLM.ChatGPT.Sora.RAG 的开源项目在 GitHub 上"争相斗艳".这不 Meta 刚开源 Llama 3 没几天,苹 ...

  10. linux文本三剑客之awk详解

    linux文本三剑客之awk详解 目录 linux文本三剑客之awk详解 1.awk命令详解 1.1 awk的处理流程 1.2 awk中的变量 1.2.1 内置变量 1.2.2 自定义变量 1.3 a ...