自定义指令
Custom directive
documentation for custom directives 演示一起使用动态参数和值:
Directive arguments can be dynamic. For example, in v-mydirective:[argument]="value"
, the argument can be updated based on data properties in our component instance! This makes our custom directives flexible for use throughout our application.
如果 "value"
不包含 space,它工作正常。但是在值中添加 space(例如 v-mydirective:[argument]="some value"
)会导致 Nuxt 窒息:
invalid expression: Unexpected identifier in
some value
Raw expression: v-mydirective:[argument]="some value"
问题是什么,我该如何解决才能使用带有 space 的字符串作为自定义指令的值?
问题:
发生这种情况是因为当我们用空格传递 value
时,表达式由 vuejs 求值,它会尝试使用 属性 some
& [ 找到 data
选项=22=]。但是由于 none 与那些 属性 名称一起存在,因此我们得到了提到的错误。
一个简单的例子来解释这一点,当我们将 value
传递为:
v-mydirective:[argument]="2"
如果我们在 bind
函数中执行 console.log
:
console.log(binding.value)
您将看到输出显示为 2
。但是,如果我们将 value
传递为:
v-mydirective:[argument]="2 + 2"
如果我们在 bind
函数中执行 console.log
,有趣的是这次显示的输出是 4
而不是 2 + 2
解决方案:
对此有两种可能的解决方案:
解决方案 #1:
您可以简单地将 some value
括在单引号中并将其作为字符串传递,例如:
v-mydirective:[argument]="'some value'"
这样表达式将被直接计算为字符串。
演示:
Vue.directive('pin', {
bind: function (el, binding, vnode) {
console.log(binding.value)
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {
direction: 'left',
}
}
})
#dynamicexample {
font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif;
color: #304455;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="dynamicexample">
<p v-pin:[direction]="'some value'">I am pinned onto the page at 200px to the left.</p>
</div>
解决方案 #2:
您还可以为其创建单独的 data
选项,例如:
data: function () {
return {
myValue: 'some value'
}
}
然后你可以在指令中使用它:
v-mydirective:[argument]="myValue"
演示:
Vue.directive('pin', {
bind: function (el, binding, vnode) {
console.log(binding.value)
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {
direction: 'left',
myValue: 'some value'
}
}
})
#dynamicexample {
font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif;
color: #304455;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="dynamicexample">
<p v-pin:[direction]="myValue">I am pinned onto the page at 200px to the left.</p>
</div>
documentation for custom directives 演示一起使用动态参数和值:
Directive arguments can be dynamic. For example, in
v-mydirective:[argument]="value"
, the argument can be updated based on data properties in our component instance! This makes our custom directives flexible for use throughout our application.
如果 "value"
不包含 space,它工作正常。但是在值中添加 space(例如 v-mydirective:[argument]="some value"
)会导致 Nuxt 窒息:
invalid expression: Unexpected identifier in
some value
Raw expression: v-mydirective:[argument]="some value"
问题是什么,我该如何解决才能使用带有 space 的字符串作为自定义指令的值?
问题:
发生这种情况是因为当我们用空格传递 value
时,表达式由 vuejs 求值,它会尝试使用 属性 some
& [ 找到 data
选项=22=]。但是由于 none 与那些 属性 名称一起存在,因此我们得到了提到的错误。
一个简单的例子来解释这一点,当我们将 value
传递为:
v-mydirective:[argument]="2"
如果我们在 bind
函数中执行 console.log
:
console.log(binding.value)
您将看到输出显示为 2
。但是,如果我们将 value
传递为:
v-mydirective:[argument]="2 + 2"
如果我们在 bind
函数中执行 console.log
,有趣的是这次显示的输出是 4
而不是 2 + 2
解决方案:
对此有两种可能的解决方案:
解决方案 #1:
您可以简单地将 some value
括在单引号中并将其作为字符串传递,例如:
v-mydirective:[argument]="'some value'"
这样表达式将被直接计算为字符串。
演示:
Vue.directive('pin', {
bind: function (el, binding, vnode) {
console.log(binding.value)
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {
direction: 'left',
}
}
})
#dynamicexample {
font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif;
color: #304455;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="dynamicexample">
<p v-pin:[direction]="'some value'">I am pinned onto the page at 200px to the left.</p>
</div>
解决方案 #2:
您还可以为其创建单独的 data
选项,例如:
data: function () {
return {
myValue: 'some value'
}
}
然后你可以在指令中使用它:
v-mydirective:[argument]="myValue"
演示:
Vue.directive('pin', {
bind: function (el, binding, vnode) {
console.log(binding.value)
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {
direction: 'left',
myValue: 'some value'
}
}
})
#dynamicexample {
font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif;
color: #304455;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="dynamicexample">
<p v-pin:[direction]="myValue">I am pinned onto the page at 200px to the left.</p>
</div>