• 组件间的通讯方式


    一、父传子

    在Vue.component(){}中,加入与template、data同级的props用来接受传值

    1. //接受传值 利用props
    2. props:{
    3. // 自定义接受
    4. //定义数据类型
    5. type : String,
    6. size:Number,
    7. pageSize:{
    8. //定义多种数据类型,用数组形式
    9. type:[Number,String],
    10. //设置默认值,若为基本数据类型不存在深拷贝的问题则可以写成对象的形式
    11. //(也可以写成函数形式),复杂数据类型写为函数形式,目的也是为了数据隔离,
    12. default(){
    13. return 5
    14. }
    15. }
    16. },

     然后再vue实例(即父级)控制区内加入组件标签,给标签的属性加冒号(:)即可获取到父级的data中的数据

    二、子传父

     (一)子组件调用父组件的方法

    1.在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)

    1. <div id='app'>
    2. <div class="container">
    3. <son @comment="comment($event,'hello')">son>
    4. <ul class="list-group">
    5. <li v-for="(item,index) in list " :key="index" class="list-group-item">{{item.content}}
    6. <span class="badge">{{item.name}}span>
    7. li>
    8. ul>
    9. div>
    10. div>
    11. --------------------js中
    12. methods: {
    13. // 1.在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)
    14. // 父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到子组件给父组件传递的数据
    15. comment(data){
    16. console.log(data);
    17. this.list.push(data)
    18. sessionStorage.setItem('list',JSON.stringify(this.list))
    19. }
    20. },

    2.子组件可以触发这个事件$emit('事件名字')

    (1)$emit方法第二个参数可以定义子组件给父组件传递的内容

    1. Vue.component('son',{
    2. template:"#son",
    3. data(){
    4. return {
    5. name:'',
    6. content:''
    7. }
    8. } ,
    9. methods:{
    10. issue(){
    11. if(this.name != '' && this.content != '') {
    12. // 2.子组件可以触发这个事件$emit('事件名字')
    13. // 1.$emit方法第二个参数可以定义子组件给父组件传递的内容
    14. this.$emit('comment',{
    15. name:this.name,content:this.content
    16. })
    17. this.name = ''
    18. this.content = ''
    19. } else {
    20. window.alert('请输入评论人及评论内容')
    21. }
    22. }
    23. }
    24. })

    (二)在父组件中怎么拿到这内容

     1.父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到

    1. const vm = new Vue({
    2. el: '#app',
    3. data: {
    4. list:[]
    5. },
    6. methods: {
    7. // 1.在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)
    8. // 父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到子组件给父组件传递的数据
    9. comment(data){
    10. //data就是子组件传来的数据
    11. console.log(data);
    12. this.list.push(data)
    13. sessionStorage.setItem('list',JSON.stringify(this.list))
    14. }
    15. },
    16. })

    2.父组件有自定义参数,可以传入$event也可以拿到子组件传递的数据。通过$event只能传递第一个参数

    1. <div id='app'>
    2. <div class="container">
    3. <son @comment="comment($event,'hello')">son>
    4. div>
    5. div>

    data即为标签中的$event,也就是子组件传来的值,data为标签中调用方法时传的参 

    1. const vm = new Vue({
    2. el: '#app',
    3. data: {
    4. list:[]
    5. },
    6. methods: {
    7. //父组件有自定义参数,可以传入$event也可以拿到子组件传递的数据。通过$event只能传递第一个参数。
    8. comment(data,data2){
    9. //data即为标签中的$event,也就是子组件传来的值,data为标签中调用方法时传的参
    10. console.log(data);
    11. console.log(data2);
    12. this.list.push(data)
    13. sessionStorage.setItem('list',JSON.stringify(this.list))
    14. }
    15. },
    16. })

    三、vuex

            1.定义:

            Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储,管理应用中所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

            2.vuex解决的问题

                    (1)行统一的状态管理,解决不同组件共享数据的问题。

                    (2)不同视图需要变更同一状态的问题。

                    (3)使用vuex之后,状态变化更加清晰。

            3.uvex的五大核心模块

    (1)state

            state是什么? 是一个单一状态树,是vuex中为一个的数据源,我们的数据都是放在state中的。
    组件中去取state的值,通过this.$store.state,
    (2)getters

    对state中的数据进行加工(派生)
    取getters中的值,通过this.$store.getters,
    (3)mutation

    修改state中的值,我们state每次变化,都应该由mutation去修改,方便追踪数据的流转。

            ①this.$store.commit('mutation类型(函数名)',"参数,参数一般是对象形式")

            ②this.$store.commit({type:'mutation类型(函数名)'},...其他参数)

    (4)action

            action类似于mutation,不同的是

            action可以包含异步操作

            action不能直接修改state,如果想修改state的话,需要触发mutation

    (5)module

            由于使用单一的状态树,项目中的状态会集中在一起,导致难以维护,这个时候可以通过module对store进行拆分。
            使用module之后,每个模块都有自己的state、mutation等内容,方便维护
     

    1. import Vuex from 'vuex'
    2. Vue.use(Vuex)
    3. export default new Vuex.Store({
    4.   state: {
    5.     // number:5,
    6.     visible: false,
    7.     userInfo:{},
    8.   },
    9.   getters: {
    10.   },
    11.   mutations: {
    12.     changeVisible(state,payload){
    13.       state.visible = payload
    14.     },
    15.     changeUserInfo(state,payload){
    16.       state.userInfo = payload
    17.     }
    18.   },
    19.   actions: {
    20.   },
    21.   modules: {
    22.   }
    23. })

    四、ref

     (一)获取dom节点

    1.给dom节点记上ref属性,可以理解为给dom节点起了个名字。

       

    ref="h11" id="h11">h1标签

    2.加上ref之后,在$refs属性中多了这个元素的引用。

    3.通过vue实例的$refs属性拿到这个dom元素。

    1. const vm = new Vue({
    2. el: '#app',
    3. data: {
    4. },
    5. methods: {
    6. changeSon(){
    7. this.$refs.myson.sonMsg = '被父组件的按钮改变'
    8. }
    9. },
    10. mounted(){
    11. console.log(document.getElementById('h11'));
    12. console.log(this.$refs);
    13. // 加上ref之后,在$refs属性中多了这个元素的引用。
    14. // 通过vue实例的$refs属性拿到这个dom元素,可以对dom元素进行操作
    15. this.$refs.h11.style.color = 'red'
    16. },
    17. })

     (二)获取组件

    1.给组件记上ref属性,可以理解为给组件起了个名字。

     

        ref="myson">

    2.加上ref之后,在$refs属性中多了这个组件的引用。

    3.通过vue实例的$refs属性拿到这个组件的引用,之后可以通过这个引用调用子组件的方法,或者获取子组件的数据。

    1. const vm = new Vue({
    2. el: '#app',
    3. data: {
    4. },
    5. methods: {
    6. changeSon(){
    7. this.$refs.myson.sonMsg = '被父组件的按钮改变'
    8. }
    9. },
    10. mounted(){
    11. // 加上ref之后,在$refs属性中多了这个组件的引用
    12. // 通过vue实例的$refs属性拿到这个组件的引用,之后可以通过这个引用调用子组件的方法,或者获取子组件的数据
    13. // 获取子组件的数据
    14. console.log(this.$refs.myson.sonMsg);
    15. //可以通过这个引用调用子组件的方法
    16. console.log(this.$refs.myson.log1());
    17. },
    18. })

    五、本地缓存

    1.localStorage

    (1)保存数据:localStorage.setItem(key,value)

    (2)读取数据:localStorage.getItem(key)

    (3)删除单个数据:localStorage.removeItem(key)

    (4)删除所有数据:localStorage.clear()

    (5)得到某个索引的key:localStorage.key(index)

    2.sessionStorage

    (1)保存数据:sessionStorage.setItem(key,value)

    (2)读取数据:sessionStorage.getItem(key)

    (3)删除单个数据:sessionStorage.removeItem(key)

    (4)删除所有数据:sessionStorage.clear()

    (5)得到某个索引的key:sessionStorage.key(index)

    六、事件总线

     6.1定义事件总线对象

    1. import Vue from 'vue'
    2. import App from './App.vue'
    3. Vue.config.productionTip = false
    4. //给Vue绑定属性
    5. Vue.prototype.xyz=100;
    6. // Vue.prototype.$EventBus=vm
    7. new Vue({
    8. beforeCreate(){
    9. //安装事件总线
    10. Vue.prototype.abc=900;
    11. Vue.prototype.$EventBus=this
    12. },
    13. render: h => h(App),
    14. }).$mount('#app')

    6.2  向总线发送事件

    语法:this.$EventBus.$emit(发送的事件名,传递的参数)

    1. <template>
    2. <div id="demo01">
    3. <h1>Demo01组件h1>
    4. <h2>从Demo02接受的收据:{{msg}}h2>
    5. <button @click="fasong">发送数据给Demo02button>
    6. div>
    7. template>
    8. <script>
    9. export default {
    10. name: "Demo01",
    11. data () {
    12. return {
    13. msg: ''
    14. }
    15. },
    16. methods: {
    17. test01 (data) {
    18. console.log(data);
    19. this.msg = data
    20. },
    21. fasong () {
    22. this.$EventBus.$emit("send", "我是Demo01页面");
    23. }
    24. },
    25. mounted () {
    26. // console.log(this);
    27. // 2.接受全局的haha事件
    28. this.$EventBus.$on('haha', this.test01)
    29. }
    30. }
    31. script>
    32. <style scoped>
    33. #demo01 {
    34. background-color: red;
    35. padding: 20px;
    36. margin-bottom: 20px;
    37. }
    38. style>

    6.3接收总线事件

        语法:this.$EventBus.$on(监听的事件名, 回调函数)

    1. <template>
    2. <div id="demo02">
    3. <h1>Demo02组件h1>
    4. <button @click="sendData">发送事件给Demo01button>
    5. <h2>从Demo01接受的收据:{{msg}}h2>
    6. div>
    7. template>
    8. <script>
    9. export default {
    10. name: "Demo02",
    11. data () {
    12. return {
    13. msg: ''
    14. }
    15. },
    16. methods: {
    17. sendData () {
    18. // 触发全局的haha事件
    19. this.$EventBus.$emit("haha", '老王')
    20. },
    21. display (data) {
    22. console.log(data);
    23. this.msg = data
    24. }
    25. },
    26. mounted () {
    27. // console.log(this.abc);
    28. console.log(this.$EventBus);
    29. this.$EventBus.$on("send", this.display)
    30. }
    31. }
    32. script>
    33. <style scoped>
    34. #demo02 {
    35. background-color: blue;
    36. padding: 20px;
    37. }
    38. style>

     6.3总线事件解绑

       语法:this.$EventBus.$off(要移除事件名)

       在组件离开,也就是被销毁前,要将该监听事件给移除,以免下次再重复创建监听。

    1. beforeDestory () {
    2. //移除事件监听send
    3. this.$EventBus.off("send")
    4. }
  • 相关阅读:
    【基本算法题-2022.7.30】10. 约数之和
    一文读懂flutter线程: 深入了解Flutter中的多线程编程
    【力扣刷题】只出现一次的数字
    debian无法使用root用户登陆系统
    RabbitMQ的应用场景
    葡萄糖-聚乙二醇-四嗪/叶酸/多巴胺 Glucose-PEG-TZ/FA/Dopamine
    基于Python实现的蚁群算法
    easyrecover15数据恢复软件官网功能介绍
    网络编程-IP、TCP、UDP1(第二十一天)
    并发编程系列之Lock锁可重入性与公平性
  • 原文地址:https://blog.csdn.net/gkx19898993699/article/details/127928743