自定义指令

问题描述 投票:1回答:1

自定义指令的文档 演示了如何将动态参数和值放在一起使用。

指令参数可以是动态的。例如,在 v-mydirective:[argument]="value"在我们的组件实例中,参数可以根据数据属性进行更新!这使得我们的自定义指令可以在整个应用程序中灵活使用。这使得我们的自定义指令可以在整个应用程序中灵活使用。

如果 "value" 不包含空格,它可以正常工作。但是在值中添加一个空格(例如 v-mydirective:[argument]="some value")会导致Nuxt窒息。

invalid expression: Unexpected identifier in

    some value

  Raw expression: v-mydirective:[argument]="some value"

问题出在哪里,我如何解决这个问题,使我能够使用一个带空格的字符串作为自定义指令的值?

vue.js nuxt.js vue-directives
1个回答
2
投票

问题。

发生这种情况是因为当我们传递 value 带空格的表达式,由vuejs进行评估,并试图找到该表达式的 data 带属性选项 some & value. 但由于这些属性名都不存在,因此我们得到了上述错误。

一个简单的例子来解释这个问题,当我们通过 value 作为。

v-mydirective:[argument]="2"

如果我们这样做 console.log 里面 bind 功能。

console.log(binding.value)

你会看到输出显示为 2. 但是,如果我们通过 value 作为。

v-mydirective:[argument]="2 + 2"

如果我们这样做 console.log 里面 bind 函数,有趣的是这次显示的输出是 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"

Demo:

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>
© www.soinside.com 2019 - 2024. All rights reserved.