Vue.extend 创建的子组件实例化时传递参数只能通过 propsData ??

发布于 2022-09-07 21:16:07 字数 2247 浏览 21 评论 0

组件内容如下

<template>
    <div ref='container' class='container'>
        <div class='list'></div>
        <div class-'btns'>
            <button @click='create'>动态添加项</button>
        </div>
    </div>
</template>
<script>
import user from 'user.vue'; // user.vue 的内容如下,请查看
export default {
    mounted () {
        this.container = this.$refs.container;
        this.list = this.container.getElementsByClassName('list')[0];
    } , 
    methods: {
        create () {
            let div = document.createElement('div');
                div.className = 'item';
            let render = document.createElement('div');
            let myComponent = Vue.extend(user);
            new myComponent({
                data () {
                    // 无法传递
                    _test_: 'test data'
                } , 
                propsData: {
                    // 可以传递,而官网解释说,该属性主要用于测试
                    // 无语了 ... 
                    __id__: 'testid'
                } , 
                provide: {
                    // 无法传递
                    find: this.find
                }
            }).$mount(render);
            div.appendChild(render);
            this.list.appendChild(div);
        } , 
        find () {
                console.log('nihao');
            }
    }
};
</script>

上面组件中点击按钮后悔挂载 user 子组件实例到 div,然后添加 divlist 内。user.vue 的内容如下:

<template>..</template>
<script>
export default {
    data () {
        return {
            say: 'nihao'
        };
    } , 
    props: ['__id__'] , 
    inject: ['find'] , // 这个 vue 会弹出警告
    mounted () {
         this.$nextTick(() => {
             console.log(this.$parent); // undefined
             console.log(this._testid_); // undefined
             console.log(this.__id__); // testid
             console.log(this.find); // undefined 
         });
    }
};
</script>

是否 Vue.extend 创建的子组件,没有上下文环境(没有父组件的概念,他就是一个独立的组件个体),仅能通过 propsData 进行数据传递(当然也可以使用全局的东西,这边不考虑 ... )??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛夏已如深秋| 2022-09-14 21:16:07

https://cn.vuejs.org/v2/guide...
通过以上链接看到解决方案,说了这样创建的组件是无法相应更新的,但是利用监听方法以及全局方法set来同步更新props
在Vue实例中构建类似于这样的

  1. First=>是一个组件,最简单的组件。。
  2. 在父组件中定义的mounted方法中创建这样的方法,之后
  3. childrenVue是用来存储你要包装的所用的元素,name是父元素的data,这里是在更新父亲元素的name数据的同时更新父元素中的由vue.extend创建的子元素
private childrenVue: Vue[] = [];
private name = "1111"; 
public mounted() {
        const firstConstruct = Vue.extend(First);
        const firstInstance =  (new firstConstruct({})).$mount();
        // 第一种方法 给子元素添加一个name属性,此时是一次性的
        this.$set(firstInstance,"name",this.ownnames[this.first]);
        // 第二种方法 是用静态工厂创建一个实例,同时设置属性名
        // Vue.set(firstinst,"name",this.ownnames[this.first]);
        // 把生成的vm实例中的$el标签元素挂载到页面中的一个元素中,而且每个便签元素只能挂载到一个点
        (document.getElementById("addarea") as any).appendChild(firstinst.$el as any);
        // 用来存储子节点的vm元素,在监听函数中监听并更新元素的name属性
        childrenVue.push(firstInstance)
    }
// 监听name
@Watch("name",{deep: true|false})
private updateChildren(oldvalue,newvalue){
    //这里我就用第二种方法更新,反正都是set方法,公用的,只是别名函数而已
     Vue.set(this.childrenVue[0],"name",newvalue)
}

可以参考我的(vue动态创建组件篇)[https://blog.csdn.net/u012491...] 的github源代码,我在博客上讲是用:is特性来做的,这样组件props可动态传递的数据。其实我的git代码已经更新到extend方法了,就是上面写的,核心原理一致,细看我的代码,也就几句话的事情,互相学习

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文