目录

  • 一、浏览器本地存储
  • 二、组件自定义事件



一、浏览器本地存储

对浏览器来说,使用 Web Storage 存储键值对比存储 Cookie 方式更直观,而且容量更大,它包含两种:localStorage 和 sessionStorage。

  • sessionStorage :为每一个数据源维持一个存储区域,在浏览器打开期间存在,包括页面重新加载
  • localStorage(长期存储) :与 sessionStorage 一样,但是浏览器关闭后,数据依然会一直存在

两者在使用的时候引用类型的值要转换成 JSON 类型。

sessionStorage :

function saveData(){
	sessionStorage.setItem('msg','hello!!!')
	sessionStorage.setItem('msg2',666)
	sessionStorage.setItem('person',JSON.stringify(p))
}

function readData(){
	console.log(sessionStorage.getItem('msg'))
	console.log(sessionStorage.getItem('msg2'))

	const result = sessionStorage.getItem('person')
	console.log(JSON.parse(result))

	// console.log(sessionStorage.getItem('msg3'))
}

function deleteData(){
	sessionStorage.removeItem('msg2')
}

function deleteAllData(){
	sessionStorage.clear()
}

localStorage:

function saveData(){
	localStorage.setItem('msg','hello!!!')
	localStorage.setItem('msg2',666)
	localStorage.setItem('person',JSON.stringify(p))
}
function readData(){
	console.log(localStorage.getItem('msg'))
	console.log(localStorage.getItem('msg2'))

	const result = localStorage.getItem('person')
	console.log(JSON.parse(result))

	// console.log(localStorage.getItem('msg3'))
}
function deleteData(){
	localStorage.removeItem('msg2')
}
function deleteAllData(){
	localStorage.clear()
}

二、组件自定义事件

父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件。

我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口 (Events interface),即:

  • 使用 $on(eventName) 监听事件
  • 使用 $emit(eventName) 触发事件

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

监听事件:

<Header @addTodo="addTodo"/>

或者

<Header ref="header"/>this.$refs.header.$on('addTodo', this.addTodo)

触发事件:

this.$emit('addTodo', todo)

举例

<template>
	<div class="student">
		<h2>学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
		<h2>当前求和为:{{number}}</h2>
		<button @click="add">点我number++</button>
		<button @click="sendStudentlName">把学生名给App</button>
		<button @click="unbind">解绑qdu事件</button>
		<button @click="death">销毁当前Student组件的实例(vc)</button>
	</div>
</template>

<script>
	export default {
		name:'Student',
		data() {
			return {
				name:'张三',
				sex:'男',
				number:0
			}
		},
		methods: {
			add(){
				console.log('add回调被调用了')
				this.number++
			},
			sendStudentlName(){
				//触发Student组件实例身上的qdu事件
				this.$emit('qdu',this.name,666,888,900)
				// this.$emit('demo')
				// this.$emit('click')
			},
			unbind(){
				this.$off('qdu') //解绑一个自定义事件
				// this.$off(['atguigu','demo']) //解绑多个自定义事件
				// this.$off() //解绑所有的自定义事件
			},
			death(){
				this.$destroy() //销毁了当前Student组件的实例,销毁后所有Student实例的自定义事件全都不奏效。
			}
		},
	}
</script>

<style lang="less" scoped>
	.student{
		background-color: pink;
		padding: 5px;
		margin-top: 30px;
	}
</style>
<template>
	<div class="app">
		<h1>{{msg}},学生姓名是:{{studentName}}</h1>

		<!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 -->
		<School :getSchoolName="getSchoolName"/>

		<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第一种写法,使用@或v-on) -->
		<!-- <Student @atguigu="getStudentName" @demo="m1"/> -->

		<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第二种写法,使用ref) -->
		<Student ref="student" @click.native="show"/>
	</div>
</template>

<script>
	import Student from './components/Student'
	import School from './components/School'

	export default {
		name:'App',
		components:{School,Student},
		data() {
			return {
				msg:'你好啊!',
				studentName:''
			}
		},
		methods: {
			getSchoolName(name){
				console.log('App收到了学校名:',name)
			},
			getStudentName(name,...params){
				console.log('App收到了学生名:',name,params)
				this.studentName = name
			},
			m1(){
				console.log('demo事件被触发了!')
			},
			show(){
				alert(123)
			}
		},
		mounted() {
			this.$refs.student.$on('qdu',this.getStudentName) //绑定自定义事件
			// this.$refs.student.$once('atguigu',this.getStudentName) //绑定自定义事件(一次性)
		},
	}
</script>

<style scoped>
	.app{
		background-color: gray;
		padding: 5px;
	}
</style>