Vue组件传值、refs、插槽

一、组件传值

1.父组件向子组件传值

因为子组件本身不能拿到父组件的data数据来用,所以在子组件里用props接收,props是一个数组

父组件向子组件传值
<div id="app">
    <com1 :parent="msg" :parentarr="arr"></com1>
</div>
<template id="com">
    <div>
        {{parent}}
        <ul>
            <li v-for="i in parentarr">{{i}}</li>
        </ul>
    </div>
</template>
<script src="lib/vue-2.4.0.js"></script>
<script type="text/javascript">
var vm=new Vue({
    el:"#app",
    data:{
        msg:"父组件的msg",
        arr:[1,2,3],
    },
    components:{
        com1:{
            template:"#com",
            props:["parent",‘parentarr‘],//父组件向子组件传值,用props
        }
    }
})
</script>

2.子组件向父组件传值

子组件不能直接使用父组件的data和methods,子组件向父组件传值用 @和$emit实现(通过函数的形式传出,在父组件接收)

做法:

在父组件里定义一个@xxx="xxx2"的方法,父组件把方法传递给子组件,this.$emit()的第一个参数和xxx的名称一样,父元素的方法xxx2传一个实参进去就相当于是当前传回来的值

this.$emit("fun1",this.xxx) 方法名字/要传出的值

子组件向父组件传值
<div id="app1">
    <com-name @fun1="getData"></com-name>
</div>

<template id="com2">
    <div>
        <button @click="getsonData">调用父组件的getdata</button>
    </div>
</template>
<script src="lib/vue-2.4.0.js"></script>
<script type="text/javascript">
var vm=new Vue({
    el:"#app1",
    data:{
        fromson:""
    },
    methods:{
        getData(x){//传实参
            console.log("父元素的方法getdata拿到子组件里的数据是==="+x)
            this.fromson=x;
        }
    },
    components:{
        comName:{
            template:"#com2",
            data(){
                return {
                    sonmsg:"子组件里的msg"
                }
            },
            methods:{
                getsonData(){
                    this.$emit("fun1",this.sonmsg)//$emit调用fun1
                }
            }
        },

    }
})
</script>

二、refs获取dom节点

Vue不提倡用原生的dom操作获取节点,它封装了自己的方法来实现获取dom

做法:

给要获取的dom一个ref属性,起一个名字,通过this.$refs来得到组件里所有有ref属性的dom节点,返回的是一个json

<div id="app">
   <p ref="p1">父组件里的p</p>
   <button @click="getCon">获取内容</button>
   <com ref="login"></com>
</div>
<template id="login">
    <div>
        <p>{{sonmsg}}</p>
    </div>
</template>
<script src="lib/vue.js"></script>
<script>
    Vue.component("com",{
        template:"#login",
        data(){
            return {
                sonmsg:"子组件的msg"
            }
        },
    })
    var vm=new Vue({
        el:"#app",
        methods:{
            getCon(){
                console.log(this.$refs.login.sonmsg)//子组件的msg
                console.log(this.$refs.p1.innerHTML)//父组件里的p
            }
        }
    })
</script>

那么,子组件向父组件传值就有俩种方法

①用@和$emit

②组件也可以有ref属性,可以通过组件的ref属性拿到子组件的data和method

三、插槽 (slot)

插槽是将父组件中的子组件模板数据正常显示出来

假设组件的名称为child

1.插槽的概念

child组件开标签和闭标签之间的内容正常不会显示在页面中,如果想要让他显示,用slot标签代表这些内容,想要让她在哪儿显示就放在模板的哪个位置

理解插槽:

组件就相当于是封装的html 那么插槽就相当于是封装函数里的参数,是每次调用时候都可以赋不同的值的东西

2.具名插槽(传递name属性)

给放在child开标签和闭标签之间的模板或者组件加上v-slot:自定义名字  的指令,在用的时候使用slot标签,在子组件中的 <slot><slot> 里面添加 name=‘自定义名字‘ ,通过name属性选择调用哪个插槽。如果父组件中有一部分没有添加 slot 属性,则此处就是默认的插槽,在子组件中的slot直接就是使用的父组件的默认插槽部分

3.后备内容

在<slot></slot>标签中的内容将在没有匹配到插槽内容时渲染

4.作用域插槽

插槽虽然是属于这个组件的,但是因为他没有放在组件的模板里,所以不能直接使用组件的data数据,如果要想使用组件的data 应该用属性传值的方法把数据传过去 在插槽里通过v-slot:xx="" 等号后面的值接收数据,接收到的数据是一个json 因为有可能传过来不只一个值

v-slot:xx="yy"  xx代表插槽的名字 yy代表接收到组件的data数据

<div id="app">
    <child>
        <template   v-slot:head="datas">
            <div>
                <h5>组件child里的头部模板=={{datas.textcon}}</h5>
            </div>
        </template>

        <template v-slot:foot>
            <div>
                <h5>组件child里的尾部模板</h5>
            </div>
        </template>

        <template>
            <div>我是一个没有名字的插槽</div>
        </template>
    </child>

    <child>
        <template v-slot:head>
            <div>
                <h4>第二次调用组件child的头部模板</h4>
            </div>
        </template>
        <template v-slot:foot>
            <div>
                <h4>第二次调用组件child的的尾部模板</h4>
            </div>
        </template>
    </child>

</div>
<template id="login">
    <div>
        <header>
            <slot name="head" :textcon="text" ></slot>
        </header>
        <p>{{text}}</p>
        <slot>AA</slot>
        <!-- 后备内容放在slot标签里,如果插槽没有传过来内容的话 默认显示AA,如果传过来内容就取代AA -->
        <footer>
            <slot name="foot"></slot>
        </footer>
    </div>
</template>
<script src="lib/vue.js"></script>
<script>
    Vue.component("child", {
        template: "#login",
        data() {
            return {
                text: "子组件的内容",
            }
        },
    })

    var vm = new Vue({
        el: "#app",
    })
</script>

原文地址:https://www.cnblogs.com/zhd09/p/11750530.html

时间: 2024-11-09 06:01:12

Vue组件传值、refs、插槽的相关文章

vue 组件传值

vue 组件传值分为 父传子.子传父.非父子传值 父组件访问子组件的值 子组件中通过this.$emit('childName',childData) 父组件通过v-on监听一个事件  @childName = "childData"    methods:{ childData (data) { console.log(data) } } 父组件通过 ref 获取子组件的值 在子组件通过ref,在父组件中通过this.$refs.refsName访问子组件中的值 注意:当 ref 和

vue 组件传值踩坑日记 1

今天在用平时很少用到的传值方式,是V2.4以后新加入属性$attrs $listener 以及inheritAttrs. 总结:这样形式的代码适合套娃模式的组件传递,却不适合兄弟组件的传值,那样的传值方式,需要创建一个事件总线,说白了就是新new一个空的vue,详见,我的第二篇日志<vue 组件传值踩坑日记 2> 废话不多说,直接上代码,大家可以边看注释边测试一下效果吧 <!DOCTYPE html> <html lang="en"> <hea

vue组件传值

如何实现父子组件之间的传值 1.父组件向子组件传值 1.在子组件中设置props:['commentId'] //子组件用来接收父组件传递过来值的属性名称 2.在父组件的自定义子组件标签中设置<subComponent :commentId="this.$route.params.photoId"></subComponent>//父组件传递值给子组件 2.子组件向父组件传值 1.在父组件的自定义标签中设置一个自定义函数<subComponent v-on

vue组件传值之父传子

1.父组件给子组件传值  home父组件  header子组件  关键字props home代码 <template> <div> <v-header :title="title" :run="run"></v-header> <h2>我是home组件</h2> </div> </template> <script> import Header from '.

vue组件 $children,$refs,$parent的使用详解

1)$refs 首先你的给子组件做标记.demo :<firstchild ref="one"></firstchild> 然后在父组件中,通过this.$refs.one就可以访问了这个自组件了,包括访问自组件的data里面的数据,调用它的函数 2)$children 他返回的是一个组件集合,如果你能清楚的知道子组件的顺序,你也可以使用下标来操作: ? 1 2 3 for(let i=0;i<this.$children.length;i++){    

Vue组件之作用域插槽

写作用域插槽之前,先介绍一下Vue中的slot内容分发: 如果<child-component></child-component>标签之间没有插入那两个p标签的话,页面会显示子组件模板中定义的"<p>父组件如果没有插入内容,我将被显示</p>"这一则内容,但如果<child-component></child-component>标签之间有插入内容的话,则子组件模板中的<slot></slot&

vue 组件传值踩坑日记 2

这里介绍一下适合兄弟组件和父子,祖孙组件之间的传值方式-事件总线,废话不多说,直接上代码 总结:说白了这东西就是一种发布订阅的模式,发数据的一方用$emit发,各个接听方用$on接受对应key的事件,on的时候,就选择在DOM挂在完毕以后进行监听,通过这样的事件去修改数据,完成传递工作,感兴趣的同学可以吧这个代码拿下去直接调试运行一下看看 <!DOCTYPE html> <html lang="en"> <head> <meta charset

【vue组件之间互相传值:父传子,子传父】

今看到一篇很不错的vue组件传值文章,便于理解,遂做笔记- 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue2.Child.vue的中创建props,然后创建一个名为message的属性 3.在App.vue中注册Child组件,并在template中加入child标签,标签中添加message属性并赋值 4.保存修改的文件,查看浏览器 5.我们依然可以对message的值进行v-bind动态绑定 此

Vue组件系统

目录: Vue组件系统之全局组件的注册 Vue组件系统之组件的复用 Vue组价系统之局部组件的注册 Vue组件系统之父子组件的通信 Vue组件系统之子父组件的通信 Vue组件系统之混入(mixin) Vue组件系统之插槽<slot></slot> Vue组件系统之具名插槽 Vue组件系统之全局组件的注册 <div id='app'> <global-component></global-component></div> <scr