美文网首页
VUE进阶 - provide 与 inject

VUE进阶 - provide 与 inject

作者: wyc0859 | 来源:发表于2020-04-26 11:16 被阅读0次

    provide / inject理解

    vue官方文档解释:这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

    provide / inject运用场景

    和prop类似,那为什么还需要provide / inject呢?
    因为在现实的项目中,我的一个组件嵌套着好几层组件,如果运用prop一层层的嵌套传递,就非常的麻烦。而provide / inject就解决了这个问题,只要在顶层父级provide里声明对象或方法,那么下一层级无论多深都能够通过inject来访问到provide的数据。

    执行顺序
    data
    provide
    created
    mounted

    示例代码 - 简单的传值

    \color{red}{ uniapp中H5和小程序都支持 }

    //index页面
    <template>
        <view>
            index
            <ac></ac>
        </view>
    </template>
    
    <script>
        import ac from "./a"
        export default {
            provide: {
                foo: {
                    "a":1,
                    "b":"你好"
                }
            },
            components:{ac}
        }
    </script> 
    
    //a组件
        import bc from "./b"
        export default {
            //屏蔽2行代码,b也能收到值
            inject: ['foo'],
            created() {
                console.log("a:",this.foo)  
            },
            components:{bc}
        }
    
    //b组件
        export default {
            data() {
                return {
                    msg:""
                }
            },
            inject: ['foo'],
            created() {
                this.msg=this.foo.b 
            } 
        }
    

    示例代码 - 传函数

    //app.vue
    <script>
        export default {  
            provide(){
                return {
                    foo:this.test
                }
            }, 
            onLaunch: function() {
                console.log('onLoad:')
            },
            onShow: function() {
                console.log('onShow:')
            },  
            methods:{
                test(e){
                    console.log("app_vue:",e) 
                }
            }
        }
    </script>
     
    
    
    //index页面 
        <view>  
            <ac></ac>
        </view> 
    <script>
        import ac from "./a"
        export default {  
            components:{ac},    
            methods:{           
            }
        }
    </script> 
    
    //a页面 
        <view>
            <view @click="sub">a组件click</view>
            <bc></bc>
        </view> 
    <script>
        import bc from "./b"
        export default { 
            //屏蔽2行代码,b也能收到值
            inject: ['foo'],
            components:{bc},        
            methods:{ 
                sub(){
                    this.foo("a")
                }           
            }
        }
    </script> 
    
    //b页面 
        <view>
            <view @click="sub">b组件click</view>
        </view>
    <script> 
        export default { 
            inject: ['foo'],
            methods:{
                sub(){
                    this.foo("b")
                }           
            }
        }
    </script> 
    
    
    演示结果

    provide / inject缺点

    1.无法追踪数据的来源
    在任意层级都能访问导致数据追踪比较困难,不知道是哪一个层级声明了这个或者不知道哪一层级或若干个层级使用了。
    2.导致组件间的耦合
    它将导致组件于组件间的耦合,使得组件复用性受到影响。

    相关文章

      网友评论

          本文标题:VUE进阶 - provide 与 inject

          本文链接:https://www.haomeiwen.com/subject/ynrdwhtx.html