Veo este error en la consola:

[Vue warn]: la propiedad o el método "producto" no está definido en la instancia, pero se hace referencia a él durante el procesamiento. Asegúrese de que esta propiedad sea reactiva, ya sea en la opción de datos o para los componentes basados en clases, inicializando la propiedad.

Mi plantilla id = "productDetail" no recibe la propiedad "producto" de la plantilla id = "producto" No sé cómo puedo impulsar esto, consulte mi código.

LISTA HTML Está bien cuando hago clic en el enlace del enrutador, la URL cambia a:

/ product / iphone-x-64-gb, por ejemplo.

<template id="product" functional>
<div class="wrapper">
    <ul class="row">
        <li v-for="(product, index) in products" class="col l4 m6 s12">
            <div class="card-box">
                <div class="card-image">
                    <img :src="product.images" :alt="product.images" class="responsive-img"/>
                </div>
                <div class="card-content">
                    <h3><a href="#">{{ product.brand }}</a></h3>
                    <span class="price-used"><i class="used">{{ index }} gebrauchte Roomba 651</i></span>
                </div>
                <div class="card-action row">
                    <span class="col s6 price"><span>{{ product.price }}</span>
                </div>
                <div>
                    <router-link class="btn btn-default light-green darken-3" :to="{name: 'product', params: {product_id: product.id}}">meer detail</router-link>
                </div>
            </div>
        </li>
    </ul>
</div>

DETALLE DEL PRODUCTO HTML (QUE NO RECIBAN EL "producto")

<template id="productDetail" functional>
<div class="row">
    <div class="col s12 m6">
        <img src="images/iphone-8-64-gb.jpg" alt="product.images" class="responsive-img"/>
    </div>
    <div class="col s12 m6">
        <h3>{{ product.title }}</h3>
        <h5>{{ product.price }}<h5>
        <div class="col s12 m6">
            <a class="waves-effect waves-light btn light-green darken-3"><i class="material-icons left">add_shopping_cart</i>kopen</a>
        </div>
        <div class="col s12 m6">
            <router-link class="btn btn-default light-green darken-3" :to="{path: '/'}">
                <span class="glyphicon glyphicon-plus"></span><i class="material-icons left">arrow_back</i>terug
            </router-link>
        </div>
    </div>
</div>

EL .JS

var List = Vue.extend(
{
    template: '#product',
    data: function ()
    {
        return {products: [],};
    },
    created: function()
    {
        this.$http.get('https://api.myjson.com/bins/17528x').then(function(response) {
            this.products = response.body.products;
        }.bind(this));
    },

});

const Product =
{
    props: ['product_id'],
    template: '#productDetail'
}

var router = new VueRouter(
{
    routes: [
    {path: '/', component: List},
    {path: '/product/:product_id', component: Product, name: 'product'},
    ]
});


var app = new Vue(
{
    el: '#app',
    router: router,
    template: '<router-view></router-view>'
});

Gracias por su ayuda.

2
Fabricio Sobral 22 feb. 2018 a las 18:09

2 respuestas

La mejor respuesta

Tus accesorios deberían ser props: ['product'] en lugar de props: ['product_id']


<parent-component :product="product"></parent-component>

ChildComponent.vue

export default {
  name: 'child-component',
  props: ['product']
}
1
Ru Chern Chong 22 feb. 2018 a las 15:59

Primero active props en la ruta:

var router = new VueRouter({
...
      path: '/product/:product_id',
      component: Product,
      name: 'product',
      props: true                    // <======= add this line
    },
...

Ahora el product_id se establecerá en el componente Product.

Entonces, desea mostrar toda la información del producto, pero en este momento solo tiene el product_id. La solución es buscar el producto:

const Product = {
  props: ['product_id'],
  template: '#productDetail',
  data: function() {                              // <============ Added from this line...
    return {
      product: {}     // add {} so no error is thrown while the product is being fetched
    };
  },
  created: function() {
    var productId = this.product_id;
    // if there is a URL that fetches a given product by ID, it would be better than this
    this.$http.get('https://api.myjson.com/bins/17528x').then(function(response) {
      this.product = response.body.products.find(function (product) { return product.id == productId });
    }.bind(this));
  }                                               // <============ ...to this line.
}

Consulte demostración de JSFiddle aquí de la solución anterior.


Solución alternativa: pasar el product completo como prop

Pase el product en el params: (junto con product_id):

<router-link class="btn btn-default light-green darken-3" :to="{name: 'product', 
             params: {product_id: product.id, product: product}}">meer detail</router-link>
                                            ^^^^^^^^^^^^^^^^^^

Activa props en la ruta:

var router = new VueRouter({
...
      path: '/product/:product_id',
      component: Product,
      name: 'product',
      props: true                    // <======= add this line
    },
...

Finalmente, agregue product para que pueda usarlo:

const Product = {
  props: ['product_id', 'product'],         // <======= added 'product' here
  template: '#productDetail'
}

Demostración de JSFiddle para esta solución aquí.

1
acdcjunior 22 feb. 2018 a las 16:25