Vue学习:17.组件通信案例-记事本
通过上一节的学习,我们了解并掌握了组件通信的定义及一般使用。那么接下来,我们将之前练习过的案例使用组件化思想来实现一下吧。
实例:记事本(组件化)
实现功能
运用组件化思想,实现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.组件通信案例-记事本的更多相关文章
- 浅谈vue学习之组件通信
vue用组件化简化了我们编写代码的复杂度,组件之间经常会出现数据传递的情况,那么组件之间是怎样通信的呢? 使用props传递数据 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内 ...
- Vue学习笔记-组件通信-子传父(自定义事件)
props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...
- Vue学习笔记-父子通信案例
<div id="app"> <cpn :number1="num1" :number2="num2" @num1chan ...
- Vue学习笔记-组件通信-父传子(props中的驼峰标识)
在组件中,使用选项props来声明需要从父级接收到的数据.props的值有两种方式:方式一:字符串数组,数组中的字符串就是传递时的名称.方式二:对象,对象可以设置传递时的类型,也可以设置默认值等. & ...
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- Vue的父子组件通信(转载)
Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子父组件通信的问题 首先我们先搭好开发环境,我们首先得装好git和npm这两个工具(如果有不清楚的同学 ...
- vue任意关系组件通信与跨组件监听状态 vue-communication
大家好!我是木瓜太香! 众所周知,组件式开发方式给我们带来了方便,不过也引入了新的问题,组件之间的数据就像被一道无形的墙隔开,如果我们希望临时让两个组件直接通信,vuex 太巨,而 $emit 又不好 ...
- Vue 非父子组件通信
组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...
- vue子父组件通信
之前在用vue写子父组件通信的时候,老是遇到问题!!! 子组件传值给父组件: 子组件:通过emit方法给父组件传值,这里的upparent是父组件要定义的方法 模板: <div v-on:cli ...
- vue学习之组件
组件从注册方式分为全局组件和局部组件. 从功能类型又可以分为偏视图表现的(presentational)和偏逻辑的(动态生成dom),推荐在前者中使用模板,在后者中使用 JSX 或渲染函数动态生成组件 ...
随机推荐
- IOT设备连接上云
如何让我的设备连接上云?参考如下路径. 云 [在阿里云开发者社区"周二开源日"的直播分享,将剖析当前 Kuberne ...
- [K8s] Kubernetes核心基础概念 Node, Pod, ReplicaSet, Deployment, Service, Ingress, ConfigMap
Node 即 Kubernetes 集群中的一台工作机器,物理机或者虚拟机. https://kubernetes.io/zh/docs/concepts/architecture/nodes/ 通常 ...
- WPF 关于将 ManipulationDeltaEventArgs 的 Manipulators 属性返回值修改为 ReadOnlyCollection 类型的提议
这是一个 WPF 框架的 API 变更提议,记录一下博客 讨论的地方是: How about change the type of ManipulationDeltaEventArgs.Manipul ...
- Ubuntu VNC 远程桌面及常见问题
一.Ubuntu 远程桌面开启 在ubuntu 设置中打开远程桌面 **注意:如果没有共享桌面选项也不要谎,只需要安装 vino 即可 sudo apt update sudo apt install ...
- 数字电路中的等效电路和FPGA中的等效电路
欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 本篇内容主要 ...
- Python 潮流周刊#48:Python 3.14 的发布计划
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 微软开源 MS-DOS「GitHub 热点速览」
上周又是被「大模型」霸榜的一周,各种 AI.LLM.ChatGPT.Sora.RAG 的开源项目在 GitHub 上"争相斗艳".这不 Meta 刚开源 Llama 3 没几天,苹 ...
- linux文本三剑客之awk详解
linux文本三剑客之awk详解 目录 linux文本三剑客之awk详解 1.awk命令详解 1.1 awk的处理流程 1.2 awk中的变量 1.2.1 内置变量 1.2.2 自定义变量 1.3 a ...