我使用 vuejs,有时我需要在模板中创建新变量。
在角度我可以去:
<div ng-app="" ng-init="myText='Hello World!'">
<h1>{{myText}}</h1>
如何在 vuejs 中实现这一点?
谢谢!
实际上不建议从模板初始化,但可以使用指令执行此操作:
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 变量,你可能需要实现一些将烤肉串转换为 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
中预先声明您的变量。
对于那些想要相同功能但不初始化数据属性的人,它会在你的 Vue 实例上调用一个函数/方法,而该函数/方法反过来可以分配值或调用 API,请查看此内容。
V-初始化指令
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>
获得这种效果的略显笨拙但完全有效的方法是使用v-for
:
<div v-for="myText in ['Hello World!']">
<h1>{{myText}}</h1>
适用于我复制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因为他的代码是这个的基础
我通常通过在页面的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
}