vue8
图一 :
图二 : 往浏览器添加一个数据
图三 : 从浏览器存储中读取一个数据
图四 : 删除一个浏览器存储的数据
下面来看一个小细节 : 当我们通过 getItem方法
读取一个 没有被浏览器存储的数据时,会返回一个 null
附上代码 :
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>localStoragetitle>
head>
<body>
<h2>localStorageh2>
<button onclick="saveData()">点我保存一个数据button>
<button onclick="readData()">点我读取一个数据button>
<button onclick="deleteData()">点我删除一个数据button>
<button onclick="deleteAllData()">清空button>
<script type="text/javascript">
let person = {
name: "张三",
age: 18
}
function saveData() {
window.localStorage.setItem("msg", "hello!")
window.localStorage.setItem("person", JSON.stringify(person))
}
function readData() {
console.log(window.localStorage.getItem("msg"))
// 这里 window 可以省略,直接写成 localStorage
let result = localStorage.getItem("person");
console.log(JSON.parse(result));
}
function deleteData(){
localStorage.removeItem("msg")
}
function deleteAllData(){
localStorage.clear();
}
script>
body>
html>
到此关于 localStorage 的几个 API 就看完了, 下面来看看 另外一个 sessionStorage
sessionStorage 中 添加一个数据到浏览器中 , 读取一个数据 等 都与 localStorage 里面是一样的 (里面的方法是一样的).
这里直接 将 上面 调用 localStorage 里的方法 ,改为调用 sessionStorage 方法即可.
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sessionStoragetitle>
head>
<body>
<h2>sessionStorageh2>
<button onclick="saveData()">点我保存一个数据button>
<button onclick="readData()">点我读取一个数据button>
<button onclick="deleteData()">点我删除一个数据button>
<button onclick="deleteAllData()">清空button>
<script type="text/javascript">
let person = {
name: "张三",
age: 18
}
function saveData() {
window.sessionStorage.setItem("msg", "hello!")
window.sessionStorage.setItem("person", JSON.stringify(person))
}
function readData() {
console.log(window.sessionStorage.getItem("msg"))
// 这里 window 可以省略,直接写成 sessionStorage
let result = sessionStorage.getItem("person");
console.log(JSON.parse(result));
}
function deleteData(){
sessionStorage.removeItem("msg")
}
function deleteAllData(){
sessionStorage.clear();
}
script>
body>
html>
图示 :
关于 使用 sessionStorage 保存数据 会在关闭浏览器后自动清空.
关于 localStorage 和 sessionStorage 统称未 webStorage.
关于 webStorage 有 :
存储内容大小一般支持 5MB 左右 (不同浏览器可能还不同)
浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制
相关 API :
a. xxxxStorage.setItem('key','value'); 该方法接收一个键和一个值作为参数 , 会把键值对添加到存储中 , 如果键名存在,则更新对应的值 (新的value 值 将 旧的 value 值覆盖掉)
b.xxxxStorage.getItem('pserson') 该方法接受一个键名作为参数 , 返回键名对应的值
c. xxxxStorage.removeItem('key') 该方法接接受一个键名作为参数 , 并把该键名从存储中删除
d. xxxxStorage.clear() 该方法会清空存储中所有数据
备注 :
a. SessionStorage 存储的内容会随着浏览器窗口关闭而消失
b. LocalStorage 存储的内容,需要手动清空才会消失
c. xxxxStorage.getItem(xxx) 如果 xxx 对应的 value 值获取不到 , 那么 getItem 的返回值 是 null
d. JSON.parse(null) 的结果依然是 null.
上面我们学习了 浏览器本地存储 ,下面我们就来修改一下之前完成的 TodoList 案例 .
之前我们的 TodoList 案例 并没有存储功能 ,下面将 用户 输入的任务存储到 浏览器中 (这里最好的做法是存入到数据库中.)
图一 :
图二 :
图三 :
TodoList 案例 完整代码
在学习 绑定自定义事件 前我们先来准备一下学习的环境 ,
创建两个 组件 School 和 Student 组件 .
School组件 :
<template>
<div class="school">
<h2>学校名称: {{ name }}h2>
div>
template>
<script>
export default {
name: "School",
data() {
return {
name: "小葵花幼儿园",
address: "翻斗花园",
};
},
};
script>
<style scoped>
.school {
background-color: skyblue;
padding: 5px;
}
style>
Student 组件 :
<template>
<div class="student">
<h2>学生姓名 : {{ name }}h2>
<h2>学生性别 : {{ sex }}h2>
div>
template>
<script>
export default {
name: "Student",
data() {
return {
name: "张三",
sex: "男",
};
},
};
script>
<style scoped>
.student {
background-color: pink;
padding: 5px;
margin-top: 30px;
}
style>
App 组件 :
<template>
<div class="app">
<h1>{{ msg }}h1>
<School :getSchoolName="getSchoolName" />
<Student />
div>
template>
<script>
import Student from "./components/Student.vue";
import School from "./components/School.vue";
export default {
name: "App",
components: {
School,
Student,
},
data() {
return {
msg: "快快乐乐学习Vue",
};
},
methods: {
getSchoolName(name) {
console.log("App 收到了学校名 : " + name);
},
},
};
script>
<style>
.app {
background-color: gray;
padding: 5px;
}
style>
完成上面环境搭建 ,会得到以下的页面效果 :
下面就来 学习给组件绑定自定义事件 :
图一 :
图二 :
图三 :
图四 :
到此我们已经学习完了 绑定自定义事件 ,下面我们来学习一下给绑定了自定义事件的组件进行解绑操作.
图一 :
图二 :
图三 :
图四 :
注意点一 :
图一 :
图二 :
图三 :
注意点二 :
图一 :
图二 :
到此两个注意点看完 , 下面就来总结一波
组件的自定义事件
一种组件间通信的方式 使用 : 子组件 ===> 父组件
使用场景 : A 是父组件 , B 是 子组件 , B 想给 A 传数据 , 那么 要在 A 中 给 B 绑定自定义事件 (事件的回调在 A 中)
绑定自定义事件 :
a. 第一种方式 , 在父组件中 :
或
b. 第二种方式 , 在父组件中
<Deom ref = "demo"/>
...
mounted(){
this.$refs.demo.$on('wahh',this.test)
}
c. 若想让自定义事件只能触发一次 , 可以使用 once
修饰符 ,或 $once
方法 (这个是在 ref 方式中使用).
触发自定义事件 : this.$emit('wahh',传递的数据)
解绑自定义事件 : this.$off('wahh')
组件上也可以绑定原生DOM事件 ,需要使用 native
修饰符
注意 : 通过 this.$refs.xxx.$on('wahh',回调)
绑定自定义事件时,回调 要么配置在 methods 中 , 要么使用箭头函数,否则this 指向会出问题 !
上面我们已经学习了 自定义事件, 下面来练习一下 ,把之前我们写的 TodoList 案例 用上自定义事件来传递数据.
图一 :
图二 :
图三 :
TodoList 自定义事件完整代码
全局事件总线 可以实现 任意组件间通信
这里我们先来看看原理图 :
图一 :
图二 :
原理图看完,下面通过代码来学习一下事件总线.
图一 :
图二 :
图三 :
图四 :
图五 :
图六 :
注意 : 绑定的事件别忘记 解绑
全局事件总线 (GlobalEventBus)
一种组件间通信的方式 , 使用于 任何组件间通信
安装全局事件总线 :
new Vue({
.....
beforeCreate(){
// 安装全局事件总线 , $bus 就是当前应用的 vm
Vue.prototype.$bus = this
}
})
使用事件总线 :
a.接收数据 : A 组件想要接收数据 , 则在 A 组件中 给 $bus
绑定自定义事件 , 事件的 回调留在 A 组件自身
methods(){
demo(data){.....}
}
.....
mounted(){
this.$bus.$on('xxxx',this.demo)
}
b. 提供数据 : this.$bus.$emit('xxxx',数据)
最好在 beforeDestroy
钩子中 , 用 $off 去解绑 当前组件所用到的 事件
上面我们已经了解完 全局事件总线,下面通过 事件总线来 修改一下我们的 TodoList 代码案例.
图一 :
图二 :