我正在使用 vuejs ,有时我需要在模板中创建新变量。
在角度我可以去:
<div ng-app="" ng-init="myText='Hello World!'">
<h1>{{myText}}</h1>
如何在 vuejs 中实现这一目标?
谢谢!
答案 0 :(得分:4)
不建议从模板初始化,但可以使用指令执行此操作:
Vue.directive('init', {
bind: function(el, binding, vnode) {
vnode.context[binding.arg] = binding.value;
}
});
您可以使用:
<div v-init:myvar="'foo'"></div>
所有这一切都取binding argument
(:
之后的这一位)并将其值设置为Vue实例的数据属性上的binding value
。
这是JSFiddle:http://jsfiddle.net/craig_h_411/snpLtt8c/
但有几点需要注意,首先binding.arg
总是作为小写传递,所以如果你想使用camelCase变量,你可能需要实现一些将kebab-case转换为camelCase的东西:
Vue.directive('init', {
bind: function(el, binding, vnode) {
// convert kebab-case to camelCase
let arg = binding.arg.split('-').map((arg, index) => {
return (index > 0) ? arg[0].toUpperCase() + arg.substring(1) : arg;
}).join('');
vnode.context[arg] = binding.value;
}
});
<强>标记强>
<div v-init:my-text="'Hello World'"></div>
以下是小提琴:http://jsfiddle.net/craig_h_411/9xepfpw3/
其次,您仍需要在data
。
答案 1 :(得分:3)
使用v-for
:
<div v-for="myText in ['Hello World!']">
<h1>{{myText}}</h1>
答案 2 :(得分:1)
对于那些希望具有相同功能但不初始化数据属性的对象,它在Vue实例上调用函数/方法,后者可以依次分配值或调用API,将其检出。
v-init指令
Vue.directive('init', {
bind: function (el, binding, vnode) {
vnode.context[binding.expression]();
}
});
示例Vue实例
new Vue({
el: '#some-element',
methods: {
callApi: function () {
// add your http api call here --.
}
}
});
HTML使用
<div id="some-element" v-init="callApi"></div>
答案 3 :(得分:0)
这适用于我复制ng-init
的用例。该指令eval
将binding.value
设置为期望值:
Vue.directive('init', {
bind: function(el, binding /*, vnode*/) {
console.log(binding.value); //# This line is optional, of course.
}
});
例如:
<div v-init="somevar = 'someval'"></div>
感谢@craig_h作为他的代码的基础
答案 4 :(得分:0)
通常,我是通过在页面的HTML代码(应用div之外)中添加脚本标签来实现此目的的。
<script>
var somevar = "somevalue";
// or
var someobj = {somekey1: "some value 1", somekey2: "some value 2};
</script>
然后在Vue应用程序的“挂载”回调中:
mounted() {
this.somevar = window.somevar;
// or:
this.someobj = Vue.util.extend(this.someobj , window.someobj);
// etc, you get the idea
}