Vue(八) localStorage、组件的自定义事件、Todo案例修改

本文主要是介绍Vue(八) localStorage、组件的自定义事件、Todo案例修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、浏览器本地存储
    • 1. 相关API
    • 2. Todo案例中的应用
  • 二、组件的自定义事件
    • 1. 回顾props传值方式
    • 2. 绑定自定义事件
      • (1)方式一:v-on或@
      • (2)方式二: ref
    • 3. 解绑自定义事件
    • 4. 注意点
    • 总结
  • 三、Todo案例采用自定义事件

一、浏览器本地存储

1. 相关API

  1. 存储内容大小一般支持5MB左右(不同浏览器可能还不一样)

  2. 浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制。

  3. 相关API:

    1. xxxxxStorage.setItem('key', 'value');
      该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。

    2. xxxxxStorage.getItem('person');

      ​ 该方法接受一个键名作为参数,返回键名对应的值。

    3. xxxxxStorage.removeItem('key');

      ​ 该方法接受一个键名作为参数,并把该键名从存储中删除。

    4. xxxxxStorage.clear()

      ​ 该方法会清空存储中的所有数据。

  4. 备注:

    1. SessionStorage存储的内容会随着浏览器窗口关闭而消失。
    2. LocalStorage存储的内容,存储在本地硬盘里,需要手动清除才会消失(clear或者手动清除)
    3. xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那么getItem的返回值是null。
    4. JSON.parse(null)的结果依然是null。
    5. xxxStorage里只能存储字符串,因此存储对象时,需借助JSON.stringfy()将对象转化为字符串进行存储。读取时,需借助JSON.parse()将读出来的字符串转为对象。

2. Todo案例中的应用

  1. 什么时候存:todo被增加、删除、修改时。
  2. 在哪里进行操作:如果是在todos的增删改的监听事件里进行存储,太麻烦。最好的方式是用watch,无论对todos进行任何的增删改查操作,只要todos发生变化,就将最新的todos重新存一份。
  3. 什么时候读取:data里数据初始化时。
// App.vuedata () {return {// 为什么要或一个空数组[]todos: JSON.parse(localStorage.getItem('todos')) || []}},watch: {todos: {deep: true, // 开启深度监视,监视到todos里某一个对象里面的属性的变化。// 若不开启深度监视,只能检测到todos里每一个对象的增加或删除,eeeehandler (value) {localStorage.setItem('todos', JSON.stringify(value))}}},

(为什么要或空数组[]) 答: 最开始是没有数据的,此时读取数据为null,JSON转完对象后也为null,而footer中用到todos.length, null没有length这个属性,就会报错。所以没数据时,给个空数组。


二、组件的自定义事件

(clickkeyup这些内置事件是给html元素用的。此处的自定义事件是给组件用的。)
通过子组件给父组件传值来举例自定义事件:
在这里插入图片描述
需求:(1) 发送学校名称给App组件,采用props的方式。(2)发送学生名称给App组件,采用自定义事件的方式

1. 回顾props传值方式

父组件向子组件传递函数,子组件调用这个函数,向父组件传值

父组件:App.vue

<!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据-->
<School :getSchoolName="getSchoolName"></School>
...
<script>
methods:{getSchoolName (schoolName) {console.log('App接收到了学校名称为:' + schoolName);}
}
</script>
...

子组件:School.vue

 <button @click="sendSchoolName">发送学校名称给APP</button>
<script>
...props: ['getSchoolName'],methods: {sendSchoolName () {// 调用父组件传递过来的方法this.getSchoolName(this.name)}},...
</script>

在这里插入图片描述

2. 绑定自定义事件

(1)方式一:v-on或@

<!-- 通过父组件给子组件绑定一个自定义事件实现(使用@/v-on):子给父传递数据-->
<Student @sendMsg="getStuName"></Student>
<!--如果只调用一次,once修饰符仍可用-->
<!-- <Student @sendMsg.once="getStuName"></Student> -->
<script>...getStuName (stuName,...a) {console.log('App接收到了学生名称为:', stuName, a);},...
</script>

@(或v-on)在Student标签身上,所以给Student的组件实例对象vc身上绑定了一个名为sendMsg的事件,当触发sendMsg事件时,getStuName事件就会被调用。

接下里的问题是:如何触发sendMsg事件?
由于是给Student组件的实例对象绑定的这个sendMsg事件,所以触发也应该发生在Student组件的实例对象(vc)里。

触发事件$emit('要触发的事件',参数1,参数2,...)

<!--Student组件-->
<button @click="sendStuName">发送学生名称给App</button>
<script>...sendStuName () {// 通过this拿到Student组件的实例对象,// 触发Student组件实例身上的sendMsg事件this.$emit('sendMsg', this.name, 666, 888)}...
</script>

在这里插入图片描述

(2)方式二: ref

通过refs获取到组件实例对象

<!--App组件-->
<!-- 通过父组件给子组件绑定一个自定义事件实现(ref):子给父传递数据-->
<Student ref="student"></Student>
<script>methods: {getStuName (stuName,...a){console.log('App接收到了学生名称为:', stuName, a);}},// 生命周期函数mounted () {console.log('mounted')// this.$refs.student 获取到student的组件实例对象// 当sendMsg被触发时,执行回调函数getStuNamethis.$refs.student.$on('sendMsg', this.getStuName)}
</script>

可实现同样的效果。
需要注意的是,自定义事件的两种方式:@/v-on 与ref 指的是绑定自定义事件的两种方式。无论哪种绑定方式,Student组件里触发事件使用的都是$emit
在这里插入图片描述
ref的方式要更灵活一点,比如要求App组件挂载之后,等5s,再给Student组件实例绑定事件。而@/v-on的方式则实现不了。

3. 解绑自定义事件

哪个组件绑定了事件,就在哪个组件里解绑

语法:

  • 组件实例.$off('事件名'):解绑一个事件
  • 组件实例.$off(['事件名1','事件名2']):解绑两个事件
  • 组件实例.$off():解绑所有事件
<!--Student组件-->
<button @click="unbind">解绑</button>
...
<script>unbind () {this.$off('sendMsg')  // 解绑一个事件},
</script>

4. 注意点

1、当$destory()时,组件实例被销毁,销毁后该组件实例的自定义事件全都不再奏效。

2、$refs回调函数
需求:将App组件将收到的学生姓名展示在页面上
在这里插入图片描述
解决:

<template><div class="app"><h2>{{ msg }},学生姓名为:{{ stuName }}</h2></div>
</template>

通过this.$refs.xxx.$on('事件名',回调函数)绑定自定义事件时,回调要么配置在methods中

   methods:{getStuName (stuName,...a){console.log('App接收到了学生名称为:', stuName, a);// 需要data里的数据接收一下this.stuName = stuName}},mounted () {this.$refs.student.$on('sendMsg', this.getStuName)}

要么用箭头函数

  mounted () {this.$refs.student.$on('sendMsg', (stuName,...a) => {console.log('App接收到了学生名称为:', stuName, a);// 此处的this指向App实例this.stuName = stuName})}

如果不用箭头函数,this指向会出问题

mounted () {this.$refs.student.$on('sendMsg', function (stuName,...a) {console.log('App接收到了学生名称为:', stuName, a);// 此处的this指的不是App组件,而是Student组件实例this.stuName = stuName})}

3、组件上写的v-on都会被当成自定义事件,即便是写点击事件@click也会当成自定义事件,想要用原生DOM事件的话,需要加native

<Student ref="student" @click.native="show"></Student>
<script>show () {console.log('组件采用原生点击事件');}
</script>

总结

  1. 一种组件间通信的方式,适用于:子组件 ===> 父组件

  2. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

  3. 绑定自定义事件:

    (1) 第一种方式,在父组件中:<Demo @atguigu="test"/><Demo v-on:atguigu="test"/>

    (2)第二种方式,在父组件中:

    <Demo ref="demo"/>
    ......
    mounted(){this.$refs.xxx.$on('atguigu',this.test)
    }
    
  4. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

  5. 触发自定义事件:this.$emit('atguigu',参数)

  6. 解绑自定义事件this.$off('atguigu')

  7. 组件上也可以绑定原生DOM事件,需要使用native修饰符。

  8. 注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

三、Todo案例采用自定义事件

此处只关注子组件向父组件传值的地方,即MyHeader与MyFooter向父组件App传值的地方
(MyList中:todos传递的是数据,而不是函数,changeTododeleteTodo涉及到App与App孙子组件的事儿,此处不进行探讨)
在这里插入图片描述
App组件中:

<MyHeader @addTodo="addTodo"></MyHeader>
<MyFooter:todos="todos"@checkAllTodo="checkAllTodo"@clearAllTodo="clearAllTodo"
></MyFooter>

MyHeader里:

 // this.addTodo(todoObj)this.$emit('addTodo', todoObj)

同理MyFooter中

    clearAll () {// this.clearAllTodo()this.$emit('clearAllTodo')}isAll: {get () {return this.doneTotal === this.total && this.total > 0},set (value) {// this.checkAllTodo(value)this.$emit('checkAllTodo', value)}}

这篇关于Vue(八) localStorage、组件的自定义事件、Todo案例修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124792

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni