在vue计算中使用箭头功能不起作用

PJC*_*der 35 javascript vue.js vuejs2

我正在学习Vue并在计算属性中使用箭头函数时遇到问题.

我的原始代码工作正常(请参阅下面的代码段).

new Vue({
  el: '#app',
  data: {
    turnRed: false,
    turnGreen: false,
    turnBlue: false
  },
  computed:{
  	switchRed: function () {
    	return {red: this.turnRed}
    },
    switchGreen: function () {
    	return {green: this.turnGreen}
    },
    switchBlue: function () {
    	return {blue: this.turnBlue}
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
.demo{
  width: 100px;
  height: 100px;
  background-color: gray;
  display: inline-block;
  margin: 10px;
}
.red{
  background-color: red;
}
.green{
  background-color: green;
}
.blue{
  background-color: blue;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.js"></script>
<div id="app">
  <div class="demo" @click="turnRed = !turnRed" :class="switchRed"></div>
  <div class="demo" @click="turnGreen = !turnGreen" :class="switchGreen"></div>
  <div class="demo" @click="turnBlue = !turnBlue" :class="switchBlue"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,在我更改了计算属性中的方法后,颜色不会改变(尽管turnRed值仍然成功地在true和false之间切换).

这是我的代码:

computed:{
    switchRed: () => {
        return {red: this.turnRed}
    },
    switchGreen: () => {
        return {green: this.turnGreen}
    },
    switchBlue: () => {
        return {blue: this.turnBlue}
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用错误的语法吗?

Amr*_*pal 56

您将面临此错误,因为箭头函数不会绑定this到您要为其定义计算属性的vue实例.如果要methods使用箭头函数定义,也会发生同样的情况.

不要在实例属性或回调上使用箭头函数(例如vm.$watch('a', newVal => this.myMethod())),由于箭头函数绑定到父上下文,因此这将不是您期望的Vue实例,并且this.myMethod将是未定义的.

你可以在这里阅读它.


thr*_*n19 36

箭头功能丢失了VueJS组件上下文.对于你的函数methods,computed,watch,...使用对象的功能:

computed:{
    switchRed() {
        return {red: this.turnRed}
    },
    switchGreen() {
        return {green: this.turnGreen}
    },
    switchBlue() {
        return {blue: this.turnBlue}
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ian 9

您可以通过从中解构您想要的内容来实现此目的:

computed:{
  switchRed: ({ turnRed }) => {red: turnRed},
  switchGreen:  ({ turnGreen }) => {green: turnGreen},
  switchBlue: ({ turnBlue }) => {blue: turnBlue}
}
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,因为计算属性接收组件实例作为其第一个参数。所以这基本上就是 switchRed: (this) =&gt; {red: this.turnRed} (8认同)

M U*_*M U 5

创建计算时,您不使用=>,您应该只使用switchRed () {...

看看片段。正常工作。

它适用于所有计算、方法、观察者等。

new Vue({
  el: '#app',
  data: {
    turnRed: false,
    turnGreen: false,
    turnBlue: false
  },
  computed:{
  	switchRed () {
    	return {red: this.turnRed}
    },
    switchGreen () {
    	return {green: this.turnGreen}
    },
    switchBlue () {
    	return {blue: this.turnBlue}
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
.demo{
  width: 100px;
  height: 100px;
  background-color: gray;
  display: inline-block;
  margin: 10px;
}
.red{
  background-color: red;
}
.green{
  background-color: green;
}
.blue{
  background-color: blue;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.js"></script>
<div id="app">
  <div class="demo" @click="turnRed = !turnRed" :class="switchRed"></div>
  <div class="demo" @click="turnGreen = !turnGreen" :class="switchGreen"></div>
  <div class="demo" @click="turnBlue = !turnBlue" :class="switchBlue"></div>
</div>
Run Code Online (Sandbox Code Playgroud)


Sol*_*tos 5

为什么不是像这样更简单的东西?

new Vue({
  el: '#app',
  data: {
    turnRed: false,
    turnGreen: false,
    turnBlue: false
  },
  methods:{
    toggle (color) {
      this[`turn${color}`] = !this[`turn${color}`];
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
.demo{
  width: 100px;
  height: 100px;
  background-color: gray;
  display: inline-block;
  margin: 10px;
}
.red{
  background-color: red;
}
.green{
  background-color: green;
}
.blue{
  background-color: blue;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.js"></script>
<div id="app">
  <div class="demo" @click="toggle('Red')" :class="{red:turnRed}"></div>
  <div class="demo" @click="toggle('Green')" :class="{green: turnGreen}"></div>
  <div class="demo" @click="toggle('Blue')" :class="{blue: turnBlue}"></div>
</div>
Run Code Online (Sandbox Code Playgroud)