我试图使我的Vue组件可重用,但其中有一部分需要在我在父组件中定义的按钮单击时运行函数.

现在我正在向组件传递两个属性:1)一个对象和2)父函数引用,这需要1)中的对象作为参数.

Child组件如下所示(删除了不必要的代码):

<button v-on:click="parentMethod(placement)">Analyze</button>

Vue.component('reporting-placement', {
    props: ['placement', 'method'],
    template: '#reporting-placement',
    methods: {
        parentMethod: function(placement) {
            this.method(placement);
        }
    }
});

parent人利用子元素的方式如下:

<reporting-placement v-bind:placement="placement" v-bind:method="analyzePlacement"></reporting-placement>

methods: {
        analyzePlacement: function(placement) {
            this.active_placement = placement;
        },
    }

如您所见,子对象只有一个属性placement和回调引用.必须将placement作为参数输入到父函数的引用函数中.

但是,由于父函数定义了参数,子函数不应该关心它需要传递给父函数的内容.相反,我更希望已经在父级中传递了参数.

所以

<reporting-placement v-bind:placement="placement" v-bind:method="analyzePlacement"></reporting-placement>

我宁愿

<reporting-placement v-bind:placement="placement" v-bind:method="analyzePlacement(placement)"></reporting-placement>

(包括子元素的适当变化).

信息:如果我像上面那样写下来,我不会收到错误消息,但当我将参数传递给组件时,整个Vue都会出错.

希望问题是明确的:-)非常感谢!

推荐答案

通过阅读你的提案,我发现你过度使用了props .

您担心子组件不应该了解父组件使用数据的方式,这是完全可以接受的.

Vue.component('reporting-placement', {
   props: ['placement', 'method'],
   template: '#reporting-placement',
   methods: {
       parentMethod: function(placement) {
           this.$emit('reporting-placement-change', placement)
       }
   }
});

你可以这样使用它:

<reporting-placement v-bind:placement="placement" @reporting-placement-change="analyzePlacement($event)"></reporting-placement>

但是,如果您需要由父方法提供的数据,最好考虑使用状态管理系统(可以是简单事件总线或事件更复杂的VUEX).

最后,如果你真的喜欢/必须把这个方法作为props 传递,你可以把它放在一个对象中,然后把这个对象作为props 传递.

Vue.js相关问答推荐

在VITE-VUE APP-DEV模式上重定向HTTP请求

Vue3外部数组的响应性

无法在cPanel/SSH上构建 | Laravel + Vue优化

我如何使用 vuejs 在我的 url 中编码一个令牌

如何在 vue 路由中导航到 Bootstrap-vue 选项卡中的特定选项卡?

Vue.js 开发工具未显示

VueJS 插件的如何react式绑定?

Vue.js 中有没有类似Jquery $(document).ready的功能?

在 Vuejs 中Watch观察 window.scrollY 的变化

单击链接会更改 url,但不会更改页面上的内容/数据

如果我观看解构的props,Vue 3 手表将无法正常工作

命名空间模块身份验证的重复命名空间身份验证

为什么 vue 文档说 refs 不是响应式的,而实际上它们是响应式的

此 set-cookie 已被阻止,因为它具有 samesite=lax

正确的 vueJS 方法将props与数据同步

删除一行后刷新 Bootstrap-Vue 表

如何将数据传递给 Vue.js 中的路由视图

根据路由动态插入 CSS 类到导航栏

如何在 vue.js 2 上循环对象观察者?

在 VueJS 中使用 Axios - 这个未定义