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 或渲染函数动态生成组件 ...
随机推荐
- EasyNLP带你玩转CLIP图文检索
简介: 本文简要介绍CLIP的技术解读,以及如何在EasyNLP框架中玩转CLIP模型. 作者:熊兮.章捷.岑鸣.临在 导读 随着自媒体的不断发展,多种模态数据例如图像.文本.语音.视频等不断增长,创 ...
- C++ 多态与虚拟:Class 语法语义
1.object与class:在object-oriented programming编程领域,对象(object)有更严格的定义.对象是由数据结构和用于处理该结构的过程(称为methods)组成的实 ...
- [Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)
在 golang 某些 orm 中,你经常会看到这种用法: func main() { db, err := gorm.Open("sqlite3", "test.db& ...
- docker、docker-compose 常用命令
1.docker 常用命令 创建容器:docker create 启动容器:docker start [id] 停止容器:docker stop [id] 停止全部运行的容器:docker stop ...
- Elasticsdump 数据导入/导出
目录 一.安装过程 安装NODE 通过npm安装elasticdump 二.数据导出 实操一 实操二 实操三 三.文件导入 一.安装过程 当前工具主要是用来对ES中的数据进行数据导入/导出,以及对数据 ...
- Goland 的配置
目录 下载安装 设置好go的系统环境变量 设置 GOROOT 设置 GOPATH 设置 MODULES 设置 工作面板里的字体缩放大小快捷键 安装主题包 安装中文中包 Redis Mannager 读 ...
- Xcode编译WebKit
下载WebKit源码 1)进入https://webkit.org/ 2)点击页面的 Get Started 进入新页面,如下图所示 3)点击 Getting the code 进入新页面,如下图所示 ...
- HTTP 连接详解
概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的,客户端可以打开一条TCP/IP连接,连接到任何地方的服务器.一旦连接建立,客户端和服务器之间交换的报文就永远不会丢失.受损或失序 T ...
- vulnhub --> Web Machine: (N7)
靶场下载地址 Web Machine: (N7) << 点我 开始打靶 ip发现: nmap扫描网段发现靶机ip:192.168.56.101 端口发现: 对靶机进行常规端口扫描 访问网站 ...
- CMD文件内容统计程序简单版本
WordCount命令行程序通过CMD接收参数,输出统计结果到指定文件. 项目码云地址:https://gitee.com/ggtc/WordCount.git 实现的功能有: 统计文件字符数 1 u ...