Nieznany element niestandardowy Vue.js


90

Jestem początkującym użytkownikiem Vue.js i próbuję stworzyć aplikację, która zaspokoi moje codzienne zadania i natknąłem się na Vue Components. Więc poniżej jest to, co próbowałem, ale niestety daje mi ten błąd:

vue.js: 1023 [Vue warn]: Nieznany element niestandardowy: - czy poprawnie zarejestrowałeś komponent? W przypadku komponentów rekurencyjnych upewnij się, że podano opcję „nazwa”.

Jakieś pomysły, pomoc, proszę?

new Vue({
  el : '#app',
  data : {
    tasks : [
      { name : "task 1", completed : false},
      { name : "task 2", completed : false},
      { name : "task 3", completed : true}
    ]
  },
  methods : {
  
  },
  computed : {
  
  },
  ready : function(){

  }

});

Vue.component('my-task',{
  template : '#task-template',
  data : function(){
    return this.tasks
  },
  props : ['task']
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.js"></script>
<div id="app">
  <div v-for="task in tasks">
      <my-task :task="task"></my-task>
  </div>
  
</div>

<template id="task-template">
  <h1>My tasks</h1>
  <div class="">{{ task.name }}</div>
</template>

Odpowiedzi:


122

Zapomniałeś o componentssekcji w swoim Vue initialization. Więc Vue tak naprawdę nie wie o twoim komponencie.

Zmień to na:

var myTask = Vue.component('my-task', {
 template: '#task-template',
 data: function() {
  return this.tasks; //Notice: in components data should return an object. For example "return { someProp: 1 }"
 },
 props: ['task']
});

new Vue({
 el: '#app',
 data: {
  tasks: [{
    name: "task 1",
    completed: false
   },
   {
    name: "task 2",
    completed: false
   },
   {
    name: "task 3",
    completed: true
   }
  ]
 },
 components: {
  myTask: myTask
 },
 methods: {

 },
 computed: {

 },
 ready: function() {

 }

});

A oto jsBin, gdzie wszystko wydaje się działać poprawnie: http://jsbin.com/lahawepube/edit?html,js,output

AKTUALIZACJA

Czasami chcesz, aby komponenty były globalnie widoczne dla innych komponentów.

W takim przypadku musisz zarejestrować swoje komponenty w ten sposób, przed Vue initializationlub export(w przypadku, gdy chcesz zarejestrować komponent z innego komponentu)

Vue.component('exampleComponent', require('./components/ExampleComponent.vue')); //component name should be in camel-case

Po dodaniu komponentu do vue el:

<example-component></example-component>

Więc jeśli mam wiele komponentów, powinienem powiązać je z tablicą komponentów?
Juliver Galleto,

Na pewno @CodeDemon. Możesz go skrócić, jeśli użyjesz ES6, na przykład, components: {myTask},lub jeśli jest to jakiś mały element, możesz go utworzyć wewnątrz componentswłaściwości. Ale wydaje się, że nie jest to dobry sposób ze względu na skalę aplikacji.
GONG,

Wszelkie pomysły, dlaczego mam to ostrzeżenie Vue: vue.js: 1023 [Vue warn]: funkcje danych powinny zwrócić obiekt. (znalezione w komponencie: <my-task>)?
Juliver Galleto,

4
trzeba to napisać tak w komponentach: data: function() { return { property1: 1, property2: 2 } }
GONG

w moim przypadku nieprawidłowo zapisałem komponenty jako komponent. stąd mam ten błąd.
mehul9595

57

Po prostu zdefiniuj Vue.component()wcześniej new vue().

Vue.component('my-task',{
     .......
});

new Vue({
    .......
});

aktualizacja

  • HTML konwertuje <anyTag> do<anytag>
  • Dlatego nie używaj wielkich liter jako nazwy komponentu
  • Zamiast <myTag>używać<my-tag>

Wydanie Github: https://github.com/vuejs/vue/issues/2308


2
To powinna być główna odpowiedź na problem. Mogę potwierdzić na podstawie dokumentacji vuejs i wypróbowując, że Vue.component powinien być umieszczony przed rootem (lub new Vue({})).
Fabián

2

To mnie rozwiązało: podałem trzeci argument będący przedmiotem.

in app.js(praca z laravel i webpack):

Vue.component('news-item', require('./components/NewsItem.vue'), {
    name: 'news-item'
});


1

Upewnij się, że dodałeś komponent do komponentów.

Na przykład:

export default {
data() {
    return {}
},
components: {
    'lead-status-modal': LeadStatusModal,
},
}

0

To dobry sposób na stworzenie komponentu w vue.

let template = `<ul>
  <li>Your data here</li>
</ul>`;

Vue.component('my-task', {
  template: template,
  data() {

  },
  props: {
    task: {
      type: String
    }
  },
  methods: {

  },
  computed: {

  },
  ready() {

  }
});

new Vue({
 el : '#app'
});

0

Śledziłem dokumentację Vue na https://vuejs.org/v2/guide/index.html, kiedy napotkałem ten problem.

Później wyjaśniają składnię:

Jak dotąd na całym świecie zarejestrowaliśmy tylko komponenty, używając komponentu Vue.com:

   Vue.component('my-component-name', {
       // ... options ...
   })

Globalnie zarejestrowane komponenty mogą być używane w szablonie dowolnej głównej instancji Vue (nowej Vue) utworzonej później - a nawet wewnątrz wszystkich> podkomponentów drzewa komponentów tej instancji Vue.

( https://vuejs.org/v2/guide/components.html#Organizing-Components )

Tak więc, jak mówi Umesh Kadam powyżej, po prostu upewnij się, że definicja komponentu globalnego jest poprzedzona var app = new Vue({})instancją.


0

Miałem ten sam błąd

[Vue warn]: Nieznany element niestandardowy: - czy poprawnie zarejestrowałeś komponent? W przypadku komponentów rekurencyjnych upewnij się, że podano opcję „nazwa”.

jednak zupełnie zapomniałem uruchomić npm install && npm run devkompilacji plików js.

może to pomoże początkującym takim jak ja.


0

OK, ten błąd może wydawać się oczywisty, ale pewnego dnia szukałem odpowiedzi, PO PROSTU OKAZAŁEM SIĘ, ŻE MIAŁEM 2 razy zadeklarowane KOMPONENTY . doprowadzało mnie to do szału bo VueJS w ogóle nie narzeka gdy deklarujesz to 2 razy, oczywiste miałem dużo kodu w międzyczasie, a jak dodałem nowy komponent, deklarację umieściłem na górze, podczas gdy ja też miałem blisko dna. Więc następnym razem poszukaj tego najpierw, oszczędza dużo czasu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.