Vue3基础学习笔记(三)探索组件9-补充说明

v-once:让某个元素标签只渲染一次

只显示一次值在页面上,之后若是动态修改值也不会进行渲染。(实际值进行了修改)

<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data(){
            return{count:1}
        },
        template:`
        <div @click="count += 1" v-once>
            {{count}}
        </div>
        `
    });
    const vm = app.mount('#root');
</script>

运行结果:
在这里插入图片描述

$refs:获取到指定设置ref的Dom节点/组件引用

在某个标签中添加​​ref="xxx"​​​,之后可通过js中使用​​$refs.xxx​​来获取到指定标签
在这里插入图片描述获取count节点

<script>
    const app = Vue.createApp({
        data(){
            return{count:1}
        },
        mounted() {
            this.$refs.count.innerHTML='hello';
        },
        template:`
        <div>
            <div ref="count">
                {{count}}
            </div>
        </div>
        `
    });
    const vm = app.mount('#root');
</script>

获取子组件

<script>
    const app = Vue.createApp({
        data(){
            return{count:1}
        },
        mounted() {
            console.log(this.$refs.common.sayHello());
        },
        template:`
        <div>
            <common-item ref="common" /> 
        </div>
        `
    });
    app.component('common-item',{
        methods: {
            sayHello(){
                alert('hello');
            }
        },
        template:`<div>hello</div>`
    });
    const vm = app.mount('#root');
</script>

provide/inject

例题

<script>
    const app = Vue.createApp({
        data(){
            return{count:1}
        },
        template:`
        <div>
            <child :count="count" /> 
        </div>
        `
    });
    app.component('child',{
        props:['count'],
        template:`<child-child  :count="count"/>`
    });
    app.component('child-child',{
        props:['count'],
        template:`<div>{{count}}</div>`
    });
    const vm = app.mount('#root');
</script>

若是我们定义了两个子组件,在父组件中使用了第一个子组件,接着在第一个子组件中复用了第二个子组件,此时第二个子组件想要使用父组件中的值就需要一层一层借助通​​:xx=“xx”+props属性​​来进行一层层往下传递。

弊端:若是有大量嵌套组件,需要重复进行v:bind以及props设置传参!

  1. 父组件定义​​provide: {}​​​属性,孙子组件或其他子组件使用​​inject: [‘xx’]​​即可拿到!
<script>
    const app = Vue.createApp({
        data(){
            return{count:1}
        },
        provide:{
            count:1,
        },
        template:`
        <div>
            <child :count="count" /> 
        </div>
        `
    });
    app.component('child',{
        template:`<child-child  />`
    });
    app.component('child-child',{
        inject:['count'],
        template:`<div>{{count}}</div>`
    });
    const vm = app.mount('#root');
</script>
  1. ​​provide​​​对象想要动态使用​​this.属性​​​拿到父组件data对象里的值,需要写成如​​
provide(){ 
	return {xxx=this.xxx}
	}​​
<script>
    const app = Vue.createApp({
        data(){
            return{count:1}
        },
        provide(){
            return {
                count:this.count,
            }
        },
        template:`
        <div>
            <child :count="count" /> 
        </div>
        `
    });
    app.component('child',{
        template:`<child-child  />`
    });
    app.component('child-child',{
        inject:['count'],
        template:`<div>{{count}}</div>`
    });
    const vm = app.mount('#root');
</script>
  1. 注意:provide属性绑定inject属性并不是双向绑定
    父组件中的值发生改变并不会重新传值过去来让子组件进行修改
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值