vue.js - 从主 vue 应用程序调用组件方法
问题描述
我是 Vue 的超级新手,我正在尝试进入组件。
基本上,我有我的新 vue 应用程序的主脚本文件(具有基于 setInterval 的倒计时功能和在同一个文件中的 vue 组件(它是一个用画布制成的耐力条),具有宽度增加和减少的方法。基本上,我想每秒减小条形宽度,但我不知道如何调用组件中声明的方法。我想当它们在组件内部声明时,我可以从任何地方访问它们,但我没有找到合适的解决方案(我试过了,$refs
但它不起作用)有什么方法可以从我的新 Vue 应用程序中的方法调用addWidth()
and函数?subWidth()
谢谢你
这是组件
Vue.component('stamina', {
template: '<div><canvas ref="stamina" style="height:25px;width:300px;" /></div>',
data(){
return {
stamina_width:300,
// vueCanvas: null
}
},
methods: {
drawStamina(){
// clear canvas
this.vueCanvas.clearRect(0, 0, 300, 50);
// draw rect
this.vueCanvas.rect(20,20, this.stamina_width, 100);
//colorize with gradient
var grd = this.vueCanvas.createLinearGradient(0, 0, 300, 0);
grd.addColorStop(0, "red");
grd.addColorStop(0.5, "orange");
grd.addColorStop(1, "green");
this.vueCanvas.fillStyle = grd;
//fill the rect with gradient
this.vueCanvas.fillRect(0, 10,this.stamina_width, 10);
},
addWidth() {
this.stamina_width += 20
this.drawStamina()
},
subWidth() {
this.stamina_width -= 20
this.drawStamina()
}
},
mounted () {
var ctx = this.$refs.stamina.getContext('2d');
this.vueCanvas = ctx;
var stam = this.stamina_width;
var grd = this.vueCanvas.createLinearGradient(0, 0, 300, 0);
grd.addColorStop(0, "red");
grd.addColorStop(0.5, "orange");
grd.addColorStop(1, "green");
this.vueCanvas.fillStyle = grd;
//fill the rect with gradient
this.vueCanvas.fillRect(0,25,stam,25);
}
});
and this is the main vue
var match = new Vue({
el:'#app',
methods:{
//call the methods from component stamina
}
解决方案
是的,您可以调用父/子组件的向上/向下方法。您可能需要查看创建自定义事件并监听它们。
我认为可能不那么复杂的另一个选择是考虑使用Vuex。
addWidth
通过这种方式,您的所有subWidth
逻辑都将驻留在一个集中的位置。您的所有组件——无论嵌套如何,都可以“订阅”这些东西(并在需要时修改它们)。
签出行动。您将调度一个将addWidth
其发送到 Vuex 的操作。在负责渲染耐力条的组件中,我将使用计算属性来监视更新。像这样的东西:
computed: {
barWidth() {
return this.$store.getters["bar/width"]; // 20
}
}
这只是一个非常粗略的示例,不太可能是您要查找的内容。
VueSchool也有一些不错的(免费)课程来帮助你熟悉 Vuex。
推荐阅读
- amazon-web-services - 将数据从一个 AWS 账户的 S3 存储桶复制到另一个 AWS 账户的 S3 存储桶
- reactjs - 如何从chartjs2堆叠图表中消除所有边框
- uml - UML - 是否可以将 ActivityPartitions 添加到 StructuredActivityNodes?
- python - 如何转换变量中的列表元素
- node.js - 如何在 foreach 循环中使用多个异步等待调用将返回值推送到数组中
- python - python中某些字符类型的最长连续子字符串
- javascript - 使用 webpack [request] 魔术注释将动态模块捆绑在一起
- python - 如何在由第二列定义的固定间隔内对一列的元素求和?
- flutter - Flutter 中如何渲染字体或者如何避免垂直间距?
- python - 在 Python 中导入时未解析的引用