【发布时间】:2021-11-17 16:34:03
【问题描述】:
在 Vue.js 2 中,我想将字符串转换为函数调用,以便可以将其设置为事件处理程序。 我相信这将非常实用,特别是在基于对象列表动态创建大量元素(例如按钮)时。
new Vue({
el: "#app",
data: {
myArray: [
{ value: 1, fn: "firstMethod" },
{ value: 2, fn: "secondMethod" },
],
},
methods: {
firstMethod() {
console.log("'firstMethod' was executed.");
},
secondMethod() {
console.log("'secondMethod' was executed.");
},
},
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<template v-for="elem in myArray">
<button @click="elem.fn"> <!-- Here is where I am stucked. -->
<!-- <button> -->
{{elem.value}}
</button>
</template>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="script.js"></script>
</body>
</html>
我第一次尝试这样做是将myArray 中的fn 属性设置为指向具有this 的相应函数的指针(例如fn: this.firstMethod)。问题是,我相信,在定义的时候,这些功能仍然是未知的,正如我得到的那样:[Vue warn]: Invalid handler for event "click": got undefined。
我正在努力实现的目标是否可能?我忽略了这个策略有什么缺点吗?
【问题讨论】:
-
我不认为你想要实现的目标是可能的,在我自己看来,这看起来并不动态
-
为什么不只使用一个函数,该函数会根据传递给函数的参数产生不同的输出,并将这些唯一参数赋予
myArray中的每个对象 -
你不应该写没有引号的函数
fn: "firstMethod"吗?否则它是一个字符串,对吗?所以fn: firstMethod应该引用方法本身。不是this.,因为这在模板中不是必需的。我会试试的。 -
@rubebop 是的,这个函数会变得很庞大......你能给我一个你会使用这种方法的场景......让我看看我是否可以提供更好的方法
-
@rubebop 哦,没错,当您在创建
data期间引用该函数时,该方法尚不存在。你可以坚持你找到的解决方案。我发现的另一种方法是覆盖create()并在那里分配要调用的函数。但这可能还不够自我解释。
标签: javascript html vue.js vuejs2