- 由于很长时间没有使用vue了,版本一直在更新,正好现在有时间再整理一下语法使用。
- 下面直接包括(子传父,父传子,slot,sessionStorage(会话数据储存)),直接给上代码
- 父组件
<template>
<div class="about">
<h1>This is an about page</h1>
<h3>{{childValue}}</h3>
<!-- :parentsData父传子 @childToParentsData:子传父 -->
<ChildAbout :parentsData="parentsData" @childToParentsData="childToParentsData">
<template v-slot:old>
<div>我是旧的</div>
</template>
<!-- mySlot是直接接收数据自定义的名字 -->
<!-- <template v-slot:new="slotData">-->
<!-- {{slotData.slotData}}-->
<template v-slot:new="{slotData}">
{{slotData}}
</template>
<!-- 简用方式#demoNew 也就是v-slot:demoNew(这个是插槽名) demoData是数据加了{demoData}的话就是传入的值-->
<template #demoNew="{demoData}">
{{demoData}}
</template>
</ChildAbout>
</div>
</template>
<script>
// 引入组件
import ChildAbout from './childAbout'
// 默认导出组件
export default {
// 组件名
name: 'about',
// 注册组件
components: {
ChildAbout
},
// 存放 数据
data: function () {
return {
parentsData: '我是父组件的数据',
childValue: '', // 此时就是子传父的值
}
},
// 存放 方法
methods: {
// 也需要接收子传过来的数据 子传父接收数据
childToParentsData(childValue) {
// childValue就是子组件传过来的值 对其赋值到当前页面
this.childValue = childValue
}
},
// 存放 过滤器
filters: {},
// 自定义 私有指令
directives: {},
// 存放 子组件
// 注意: 组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
// props 中的数据,都是只读的,无法重新赋值
// props: [], // 把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据
/* 生命周期函数 */
// 创建期间
beforeCreate() {
// console.log('beforeCreate:刚刚new Vue()之后,这个时候,数据还没有挂载呢,只是一个空壳')
},
// 一般页面加载时请求后台数据(axios)
created() {
// console.log('created:这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发updated函数')
// console.log('在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取')
// console.log('接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染')
},
beforeMount() {
// console.log('beforeMount:虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated')
// console.log('在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取')
// console.log('接下来开始render,渲染出真实dom')
},
mounted() {
// console.log('mounted:此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了')
// console.log('可以在这里操作真实dom等事情...')
},
// 运行期间(也就是事件过后改变数据等等)
beforeUpdate() {
//这里不能更改数据,否则会陷入死循环
// console.log('beforeUpdate:重新渲染之前触发')
// console.log('然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染')
},
// 数据更新
updated() {
//这里不能更改数据,否则会陷入死循环
// console.log('updated:数据已经更改完成,dom也重新render完成')
},
// 销毁时期
beforeDestroy() {
// console.log('beforeDestory:销毁前执行($destroy方法被调用的时候就会执行),一般在这里善后:清除计时器、清除非指令绑定的事件等等...')
},
destroyed() {
// console.log('destroyed:组件的数据绑定、监听...都去掉了,只剩下dom空壳,这里也可以善后')
}
}
</script>
<!--scoped是在这个组件才能使用的样式-->
<style scoped>
</style>
- 子组件(child)
<template>
<div id="main">
{{cilldData}}
----------我是子组件
{{parentsData}}
<button @click="childToParentsData">子传父的值</button>
<slot name="old">我是默认slot的内容</slot>
<!-- 包括具名插槽 绑定的动态的值-->
<slot name="new" :slotData="slotData">
<!-- {{slotData}}-->
</slot>
<slot name="demoNew" :demoData="demoData"></slot>
</div>
</template>
<script>
export default {
name: 'cilldAbout',
// 存放 数据
// 这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。
// 在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值:
props:{ // 接收了父组件传过来的值
parentsData:String, // 传的数据为字符串,不是字符串就报错
},
data: function () {
return {
demoData:'我是demoData',
slotData:'我是slot里面的数据',
cilldData:'我是子组件的数据',
parentsDataMe:this.parentsData, //本地的 data 属性并将这个 prop 用作其初始值
}
},
// 存放 方法
methods: {
// 父传子数据 通过@click绑定事件传值
childToParentsData(){
// 会话储存数据(getItem(获取数据))(setItem设置数据)
// this.slotData=sessionStorage.getItem('key')
// sessionStorage.setItem('key', this.demoData)
this.$emit('childToParentsData',this.cilldData)
},
},
}
</script>
<style scoped>
</style>
- 其实做项目会用到vuex(状态管理器),个人理解就是全局变量储存的数据各个组件都可以用(用于组件嵌套比较深以及兄弟组件之间的传值)。
总结:很多东西不用真的容易忘,代码这个东西多看多敲防止忘了(毕竟学得东西太多了)。