IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue中父子组件之间的通信(传递数据)以及父子组件的相互访问 -> 正文阅读

[JavaScript知识库]Vue中父子组件之间的通信(传递数据)以及父子组件的相互访问

一、父组件向子组件传递

父组件向子组件传递数据,可以通过props属性来实现
1.1 第一种写法:使用数组类型

    <script src="../JS/vue.js"></script>
    <script>
       

        const app = new Vue({
            el: '#app',
            //父组件中要传递的数据:
            data: {
                message: 'Ocean',
                movies:['海贼王','fate','vivy']
            },
            components:{
                cpn:{
                    template:'#cpn',
                    // 父传子 通过props 方式一: 数组 
                    props:['cmovies','cmessage']
                }
            }
    })
    </script>

    <div id="app">
    //切记不要忘记,在使用这个子组件的时候,将要传递过来的数据动态的绑定在自定义属性上
        <cpn :cmovies="movies" :cmessage="message"></cpn>
    </div>
<!-- 子组件模板 -->
    <template id="cpn">
        <div>
        //在这里使用了从父组件传递过来的数据
           <ul>
               <li v-for="item in cmovies">{{item}}</li>
           </ul>
            <p>{{cmessage}}</p>
        </div>
    </template>

1.2 第二种写法:使用对象类型(这种方法可以对数据进行类型的限制)

    <script>
       

        const app = new Vue({
            el: '#app',
            data: {
                message: 'Ocean',
                movies:['海贼王','fate','vivy']
            },
            components:{
                cpn:{
                    template:'#cpn',
                    props:{
                        //1.这种写法 可以进行 数据类型限制
                        cmovies:Array,
                        cmessage:String
                    }
                }
            }
    })
    </script>

1.3 第三种写法 可以添加默认值
当没有传入对应的值的时候会使用默认值

    <script>
       

        const app = new Vue({
            el: '#app',
            data: {
                message: 'Ocean',
                movies:['海贼王','fate','vivy']
            },
            components:{
                cpn:{
                    template:'#cpn',
                    props:{
                        cmovies:{
                            //可以提供一些 默认值(没有传递时 会使用默认值)
                            type:Array,
                            default:'aaaaa',
                            // 表示等使用此组件的时候必须传入此值
                            required:true
                        },
                        cmessage:{
                            type:String,
                            default:[]
                        }
                    }
                }
            }
    })
    </script>

二、子组件向父组件传递

我们可以通过自定义事件,来达到子组件向父组件通信的目的
代码如下:

    <div id="app">
    	//为子组件绑定自定义的事件
        <cpn @itemclick="cpnClick"></cpn>
    </div>
    
    <!-- 子组件模板 -->
    <template id="cpn">
        <div>
            <button v-for="item in categories"
                @click="btnClick(item)"
            >{{item.name}}</button>
        </div>
    </template>
    <script src="../JS/vue.js"></script>
    <script>


        const app = new Vue({
            el: '#app',
            data: {
                message: 'Ocean'
            },
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return {
                            categories:[
                                {
                                    id:'aaa',
                                    name:'热门推荐'
                                },
                                {
                                    id:'bbb',
                                    name:'手机数码'
                                },
                                {
                                    id:'ccc',
                                    name:'生活用品'
                                },
                                {
                                    id:'ddd',
                                    name:'食品零食'
                                }
                            ]
                        }
                    },
                    methods:{
                        btnClick(item){
                        //事件触发后,发送事件以及要传递的数据item
                            this.$emit('itemclick',item)
                        }
                    },
                }
            },
            methods:{
                cpnClick(item){
                    console.log(item);
                }
            }
            
    })
    </script>

三、父组件访问子组件

    <div id="app">
        <cpn></cpn>
        <cpn></cpn>
        <cpn ref="aaa"></cpn>
        <button @click="btnClick">按钮</button>
    </div>
   <template id="cpn">
        <div>
            <p>我是子组件</p>
        </div>
   </template> 

    <script src="../JS/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                message: 'Ocean'
            },
            components:{
                cpn:{
                    template:'#cpn',
                    methods:{
                        showMessage(){
                            console.log('showMessage');
                        }
                    },
                    data(){
                        return {
                            name: '我是子组件的name'
                        }
                    }
                }
            },
            methods:{
                btnClick(){
                    // 1. 通过$children
                    console.log(this.$children);
                    this.$children[0].showMessage();
                    console.log(this.$children[0].name);
                    // 2. 使用 $refs 默认是一个空对象 需要在组件上加上属性 res
                     console.log(this.$refs.aaa.name);
                }
            }
    })
    </script>

注意:使用 $refs 默认是一个空对象 需要在组件上加上属性 res,来告诉vue需要访问的哪一个子组件

四、子组件访问父组件

可以通过 $parent 来访问父组件中的数据;也可以通过 $root来直接访问根组件

    <div id="app">
        <h2>我是cpn组件</h2>
        <cpn></cpn>
    </div>
   <template id="cpn">
        <div>
            <ccpn></ccpn>
        </div>
   </template> 

   <template id="ccpn">
    <div>
        <h2>我是cpn的子组件</h2>
        <button @click="btnClick">按钮</button>
    </div>
   </template>

    <script src="../JS/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                message: 'Ocean'
            },
            components:{
                cpn:{
                    template:'#cpn',
                    components:{
                        ccpn:{
                            template:'#ccpn',
                            methods:{
                                btnClick(){
                                    // 通过 $parent 访问父组件
                                    console.log(this.$parent);
                                    console.log(this.$parent.name);
                                    // 也可以直接访问 根组件$root
                                     console.log(this.$root.message);
                                }
                            },

                        }
                    },
                    data(){
                        return {
                            name: '我是cpn的name'
                        }
                    }
                },
                
            },
            
    })
    </script>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:15:56  更:2021-09-02 11:18:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:37:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码