vue 函数式组件如何添加监听watch

发布于 2022-09-30 23:10:01 字数 830 浏览 29 评论 0

我有这样一段代码,动态生成组件,

  Vue.component("ht-vnode", {
    functional: true,
    render: (h, ctx) => {
      // 复制父组件的属性到子组件中
      let assembly = {
        ...ctx.props.vnode.componentOptions.propsData,
        ...ctx.props
      };
      delete assembly["vnode"];
      ctx.props.vnode.componentOptions.propsData = assembly;
      ctx.props.vnode.componentOptions.listeners = ctx.listeners;
      // ctx.props.vnode.context.
      console.log('ctx===', ctx)
      return ctx.props.vnode;
    }
  });
};

然后在其它组件里面这样使用:

 <ht-vnode :vnode="vnode" :label-width="labelWidth" @enter-search="search" @field-loaded="handleFieldLoaded"
                  @input-change="handleInputChange" @change-options="handleOptionsChange"/>

现在的问题是我的ht-vnode组件里面有个props属性想监听它的变化,如何处理呢?

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

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

发布评论

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

评论(2

抹茶夏天i‖ 2022-10-07 23:10:01

什么是函数式组件
没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法,它只是一个接受一些 prop 的函数。简单来说是 一个无状态和无实例的组件

折戟 2022-10-07 23:10:01

那你就不应该用 Functional Components,它的定位就是非响应式的。

https://vuejs.org/v2/guide/re...

The anchored heading component we created earlier is relatively simple. It doesn’t manage any state, watch any state passed to it, and it has no lifecycle methods. Really, it’s only a function with some props.

In cases like this, we can mark components as functional, which means that they’re stateless (no reactive data) and instanceless (no this context).


【补充:评论区的示例代码】

const watchers = [];

Vue.component('ht-vnode', {
    props: {
        vnode: Object
    },

    mounted() {
        this.$nextTick(() => {
            const handler = function (newVal, oldVal) {
                console.log('BINGO! It changed!', newVal, oldVal);
            }

            const setWatchers = function (coms) {
                if (!coms || !coms.length)
                    return;
                
                // 递归设置子组件、子组件的子组件、子组件的子组件的子组件 ... 的 Watcher
                for (let i = 0; i < coms.length; i++) {
                    let child = coms[i];
                    let watcher = child.$watch('$data', handler, { deep: true, immediate: true });
                    watchers.push(watcher);
                    
                    setWatchers(child.$children);
                }
            }

            setWatchers(this.$children);
        });
    },

    beforeUnmount() {
        // 卸载 Watcher
        watchers.forEach(unwatch => unwatch());
    },

    render(h) {
        // 省略跟 Watch 无关的代码
    }
});

这样当你输入值就会触发 watchHandler 了。注意会有两个触发事件,一个是外层那个 Field 组件的选中状态改变;一个是里面那个 Input 组件输入值改变。

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