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

实例:记事本(组件化)

实现功能

运用组件化思想,实现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. MaxCompute管家详解--管家助力,轻松玩转MaxCompute

    精彩视频回顾请点击:MaxCompute管家详解以下是直播内容精华整理,主要包括以下四个方面:1.背景速览:2.功能介绍:3.案例讲解:4.新功能预告. 一.背景速览 MaxCompute(原ODPS ...

  2. [GPT] export default {} 和 export {} 的区别

    在JavaScript ES6模块系统中,export default {} 和 export {} 有明显的区别: 1. export default {}: 这个语法用于导出一个默认的模块成员,它 ...

  3. [PHP] 有关PHP浮点数默认显示位数 precision 以及如何调整

    PHP 以浮点数显示的有效位数默认是 14 位.-1 表示将使用一种增强的算法来四舍五入这些数字. 如果想显示更长的浮点位数,可以设置如:ini_set('precision', 40); 有两点需要 ...

  4. dotnet 警惕 C# 的 is var 写法

    本文将和大家介绍 C# 语言设计里面,我认为比较坑的一个语法.通过 is var 的写法,会让开发者误以为 null 是不被包含的,然而事实是在这里的 var 是被赋予含义的,将被允许 null 通过 ...

  5. GeoHash实现附近的人功能(如微信附近的人、共享单车附近的车辆、美团附近的商家)

    如何查找当前点(118.818747°E,32.074497°N)附近500米的人? 这一类功能很常见(如微信附近的人.共享单车附近的车辆.美团附近的商家),那在java中是如何实 现的呢? 1 实现 ...

  6. netcore5下ocelot网关简单使用

    1.新建aspnetcoremvc项目,带home控制器的就可以了,测试用能启动就行,代码无需做任何更改. 2.新建空的aspnetcoremvc项目,做如下更改: 1..  2.. 3..  4.. ...

  7. WebStorm2023安装prettier并生效

    1.首先去File > Settings > Plugins 里下载并install插件 Prettier 2.在settings里搜索prettier,按图片所示设置一下Apply 3. ...

  8. 【GUI界面软件】抖音评论采集:自动采集10000多条,含二级评论、展开评论!

    目录 一.背景说明 1.1 效果演示 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景说明 1.1 效果演示 ...

  9. OpenCompass-书生浦语大模型实战营第二期第7节作业

    书生浦语大模型实战营第二期第7节作业 这一节的作业和第6节作业一样没有特别多好说的,以运行结果为主. 基础作业 使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C- ...

  10. 04 Xpath_[实例]爬取maoyan

    目录 Xpath lxml库的安装和使用 提取的内容 代码 生成的csv 下载的图片 参考文档 Xpath lxml库的安装和使用 提取的内容 随意选取的一段 节点包含的影片信息,如下所示: < ...