Vue.js 在子组件中调用方法的Vue最佳实践
我已经阅读了很多关于这方面的文章,似乎有多种方法可以做到这一点,许多作者建议不要使用某些实现 为了简单起见,我创建了一个非常简单的版本来实现我想要实现的目标 我有一个父Vue,parent.Vue。它有一个按钮:Vue.js 在子组件中调用方法的Vue最佳实践,vue.js,Vue.js,我已经阅读了很多关于这方面的文章,似乎有多种方法可以做到这一点,许多作者建议不要使用某些实现 为了简单起见,我创建了一个非常简单的版本来实现我想要实现的目标 我有一个父Vue,parent.Vue。它有一个按钮: <template> <div> <button v-on:click="XXXXX call method in child XXXX">Say Hello</button> </div> &
<template>
<div>
<button v-on:click="XXXXX call method in child XXXX">Say Hello</button>
</div>
</template>
我想在单击父菜单中的按钮时调用sayHello()
函数
我正在寻找实现这一目标的最佳实践方法。我看到的建议包括事件总线、子组件引用和道具等
在我的方法中,执行函数的最简单方法是什么
抱歉,这看起来非常简单,但我确实尝试过做一些研究
谢谢 我不确定这是不是最好的办法。但我可以解释我能做什么。。。 代码沙盒演示: 从父组件发送
prop
数据,例如msg
。每当单击按钮切换msg
true/false时,在父级上有一个按钮
<template>
<div class="parent">
Button from Parent :
<button @click="msg = !msg">Say Hello</button><br/>
<child :msg="msg"/>
</div>
</template>
<script>
import child from "@/components/child";
export default {
name: "parent",
components: { child },
data: () => ({
msg: false
})
};
</script>
一个简单的方法是:
点击我
只需为子组件创建一个
ref
,您就可以调用方法并访问它拥有的所有数据。您可以创建一个ref
并访问方法,但不建议这样做。您不应该依赖组件的内部结构。这样做的原因是您将紧密耦合组件,而创建组件的主要原因之一就是松散耦合组件
您应该依靠合同
(某些框架/语言中的接口)来实现这一点。Vue
中的合同
依赖于这样一个事实:父母通过道具与子女沟通
,子女通过事件与父母沟通
当您希望在非父/子组件之间进行通信时,至少还有两种其他通信方法:
- 活动巴士
我现在将描述如何使用道具:
1.在子组件上定义它
props:['testProp'],
方法:{
你好{
警惕(“你好”);
}
}
2.在父组件上定义触发器数据
数据(){
返回{
触发器:0
}
}
3.在父组件上使用道具
4.观察子组件中的testProp
,并调用sayHello
watch:{
testProp:function(newVal、oldVal){
这个。sayHello()
}
}
5.从父组件更新触发器。确保始终更改触发器的值,否则手表将无法启动。一种方法是增加触发器,或者将其从truthy值切换为falsy值(this.trigger=!this.trigger)一个简单的解决方案是从vanilla JS使用
在父组件中:
const customEvent = new CustomEvent('custom-event');
document.dispatchEvent(customEvent);
document.addEventListener('custom-event', this.functionToCall);
在子组件中:
const customEvent = new CustomEvent('custom-event');
document.dispatchEvent(customEvent);
document.addEventListener('custom-event', this.functionToCall);
我不喜欢这里用道具作为触发器的方式。我怀疑这是vue推荐的解决方案。当您更改触发器
变量时,不清楚您是否正在调用函数。您现在对“组件的内部结构”的依赖程度与调用$refs.childComp.sayHello()
一样,因为testProp
是一个属性,就像sayHello()
一样。实际上,使用props从父级到子级进行通信是推荐的方法。您不是依赖于组件的内部结构,而是依赖于组件公开的道具,这与接口或类的公共字段的行为非常相似。目前,道具调用sayHello的事实是一个实现细节。父级不应该依赖于此,它应该依赖于这样一个事实,即testProp所做的是有文档记录的,而不看实现。如果您正在演示如何使用prop和watcher调用函数,那么这是一个糟糕的设计,仍然是耦合的。更好的方法是发出一个“triggerAlert”事件并在父级中实现该方法,但就个人而言,有时会觉得这违反了SRP。就我个人而言,我不认为在有意义的地方调用公开的方法有什么错。我看到太多的例子,人们在只需要进行方法调用的情况下就扭曲实现来适应道具/事件。虽然这解决了问题,但从长远来看,这可能是一个糟糕的代码可读性解决方案。当问题要求“最佳实践”时,情况尤其如此