简体   繁体   English

Vue Uncaught TypeError:fn.bind不是函数

[英]Vue Uncaught TypeError: fn.bind is not a function

My App.vue looks as follows 我的App.vue看起来如下

<template>
  <div id="app">
    <home-central></home-central>
  </div>

</template>

<script>
import HomeCentral from './components/HomeCentral';

export default {
  name: 'App',
  components: {
    HomeCentral,
  },
};
</script>
<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

I have the following code in src/components/HomeCentral.vue 我在src / components / HomeCentral.vue中有以下代码

<template>
    <div class="homecentral">
        <input type="text" v-model="title"><br/>
        <h1>{{title}}</h1>
        <p v-if="showName">{{user.first_name}}</p>
        <p v-else>Nobody</p>
        <ul>
            <li v-for="item in items" :key="item.id">{{item.title}}</li>it
        </ul>
        <button v-on:click="greet('Hello World')">Say Greeting</button>
        <br/>
        <input type="text" v-on:keyup="pressKey" v-on:keyup.enter="enterHit">
        <label>First Name: </label><input type="text" v-model="user.firstName">
        <br/>
        <label>Last Name: </label><input type="text" v-model="user.lastName">
        <h3></h3>
    </div>
</template>

<script>
export default {
  name: 'HomeCentral',
  data() {
    return {
      title: 'Welcome',
      user: {
        firstName: 'John',
        lastName: 'Doe',
      },
      showName: true,
      items: [
          { title: 'Item One' },
          { title: 'Item Two' },
          { title: 'Item Three' },
      ],
    };
  },
  methods: {
    greet: function (greeting) {
      alert(greeting);
    },
    pressKey: function (e){
      console.log('pressed' + e.target.value);
    },
    enterHit() {
      console.log('You hit enter');
    },
    computed: {
      fullName: function() {
        return this.user.firstName + ' ' + this.user.lastName;
      }
    },
  },
};
</script>

<style scoped>

</style>

This throws the following error : 这会引发以下错误:

vue.runtime.esm.js?ff9b:205 Uncaught TypeError: fn.bind is not a function
    at nativeBind (vue.runtime.esm.js?ff9b:205)
    at initMethods (vue.runtime.esm.js?ff9b:3537)
    at initState (vue.runtime.esm.js?ff9b:3305)
    at VueComponent.Vue._init (vue.runtime.esm.js?ff9b:4624)
    at new VueComponent (vue.runtime.esm.js?ff9b:4794)
    at createComponentInstanceForVnode (vue.runtime.esm.js?ff9b:4306)
    at init (vue.runtime.esm.js?ff9b:4127)
    at createComponent (vue.runtime.esm.js?ff9b:5604)
    at createElm (vue.runtime.esm.js?ff9b:5551)
    at createChildren (vue.runtime.esm.js?ff9b:5678)

Things start to work fine if I remove the computed block : 如果我删除计算块,事情开始正常工作:

computed: {
  fullName: function() {
    return this.user.firstName + ' ' + this.user.lastName;
  }
},

Please help me figure out what I'm doing wrong. 请帮我弄清楚我做错了什么。

The methods block should only contain javascript functions. 方法块应该只包含javascript函数。 I also got this error when I had a nested object with methods inside the methods block. 当我在方法块中有一个带有方法的嵌套对象时,我也遇到了这个错误。

Ie: 即:

methods: {
  namespace: {
    methodName () {
    }
  }
}

Should be formatted to 应格式化为

methods: {
  namespace-methodName () {
  }
}

can you please add below code and try, 你可以加下面的代码并尝试,

<template>
<div class="homecentral">
    <input type="text" v-model="title"><br/>
    <h1>{{title}}</h1>
    <p v-if="showName">{{user.first_name}}</p>
    <p v-else>Nobody</p>
    <ul>
        <li v-for="item in items" :key="item.id">{{item.title}}</li>it
    </ul>
    <button v-on:click="greet('Hello World')">Say Greeting</button>
    <br/>
    <input type="text" v-on:keyup="pressKey" v-on:keyup.enter="enterHit">
    <label>First Name: </label><input type="text" v-model="user.firstName">
    <br/>
    <label>Last Name: </label><input type="text" v-model="user.lastName">
    <h3></h3>
</div>

<script>
export default {
name: 'HomeCentral',
data() {
return {
  title: 'Welcome',
  user: {
    firstName: 'John',
    lastName: 'Doe',
  },
  showName: true,
  items: [
      { title: 'Item One' },
      { title: 'Item Two' },
      { title: 'Item Three' },
  ],
};
},
methods: {
greet: function (greeting) {
  alert(greeting);
},
pressKey: function (e){
  console.log('pressed' + e.target.value);
},
enterHit() {
  console.log('You hit enter');
}
},
computed: {
  fullName: function() {
    return this.user.firstName + ' ' + this.user.lastName;
  }    
},
};
</script>

<style scoped>

</style>

you accidentally nested computer inside method. 你不小心嵌入了计算机里面的方法。

vue namespace bug & solutions vue命名空间错误和解决方案

I will never recommended use vue & vue componets in this way 我永远不会建议以这种方式使用vue和vue组件

click event bind bug 单击事件绑定错误

在此输入图像描述

solution (global this namespace bug) 解决方案(全局this命名空间bug)

just return an instance of vue, and everything is OK now. 只返回一个vue实例,现在一切正常。

在此输入图像描述

more details 更多细节

https://github.com/xgqfrms/vue/issues/49 https://github.com/xgqfrms/vue/issues/49

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM