【问题标题】:How to display button link with vue.js?如何使用 vue.js 显示按钮链接?
【发布时间】:2017-06-10 04:11:45
【问题描述】:

我的看法是这样的:

<div class="panel panel-default panel-store-info">
    ...
    <div id="app">
        <AddFavoriteProduct></AddFavoriteProduct>
    </div>
    ....
</div>

我的组件是这样的:

<template>
    <a href="javascript:" class="btn btn-block btn-success" @click="addFavoriteProduct({{ $product->id }})">
        <span class="fa fa-heart"></span>&nbsp;Favorite
    </a>
</template>

<script>
    export default{
        name: 'AddFavoriteProduct',
        props:['idProduct'],
        methods:{
            addFavoriteProduct(event){
                event.target.disabled = true
                const payload= {id_product: this.idProduct}
                this.$store.dispatch('addFavoriteProduct', payload)
                setTimeout(function () {
                    location.reload(true)
                }, 1500);
            }
        }
    }
</script>

点击收藏按钮时,会调用laravel上的控制器

我已经像这样在 app.js 上注册了:

...
import AddFavoriteProduct from './components/AddFavoriteProduct.vue';
...
components: {
                ...
                AddFavoriteProduct
            },
...

执行时,按钮收藏夹不出现。

请帮忙。

更新

存在这样的错误:

[Vue 警告]:未知的自定义元素:- 您是否正确注册了组件?对于递归组件,请确保提供“名称”选项。 (在根实例中找到)

虽然我已经注册了它

【问题讨论】:

  • 您是否在使用任何其他组件,或者这是您正在尝试的第一个组件,如果可能的话,您也可以添加整个 App.js。你用的是哪个版本的vue
  • @Saurabh,是的,我还有另一个组件。另一个组件运行良好

标签: javascript laravel vue.js laravel-5.3 vuejs2


【解决方案1】:

我可以看到三个修复...

首先,在您的组件中省略name: 'AddFavoriteProduct'(单文件组件不需要)并在模板中使用kebab-case 作为组件。其次,您似乎缺少 id-product 道具

<add-favorite-product :id-product="someProductIdFromSomewhere"></<add-favorite-product>

第三,您不会在绑定属性中使用插值,甚至不需要将 $event 以外的任何内容传递给您的 addFavoriteProduct 方法

@click="addFavoriteProduct($event)"

【讨论】:

  • 太棒了。谢谢。有用。但是当点击按钮收藏时,存在错误:[vuex] unknown action type: addFavoriteProduct
  • @mosestoh 错误提示vuex 找不到动作addFavoriteProduct。您是否在 vuex 商店中声明/定义了操作?
  • @Donkarnash,是的。 vuex 商店中的动作
  • @Phil,看来我又需要你帮忙了 :) 看看这个:stackoverflow.com/questions/41904428/…
【解决方案2】:

你有什么错误吗?

我在您的代码中看到的一个错误是,您正在使用一个参数:事件,而您试图将 {{ $product-&gt;id }} 传递给它,这似乎是一个 laravel 变量。 (对不起,我不知道laravel)

如果您希望在方法中同时使用事件和product-&gt;id,则必须从 HTML 传递这两个参数,就像在 docs 中一样,在 $event 的帮助下

<template>
    <a href="javascript:" class="btn btn-block btn-success" @click="addFavoriteProduct({{ $product->id }},  $event)">
        <span class="fa fa-heart"></span>&nbsp;Favorite
    </a>
</template>

<script>
    export default{
        name: 'AddFavoriteProduct',  // I am not sure if name is needed, don't remember seeing it in docs
        props:['idProduct'],
        methods:{
            addFavoriteProduct(productId, event){
                event.target.disabled = true
                const payload= {id_product: this.idProduct}
                this.$store.dispatch('addFavoriteProduct', payload)
                setTimeout(function () {
                    location.reload(true)
                }, 1500);
            }
        }
    }
</script>

另一个问题是你期待一个 prop idProduct,它没有被传递给组件,你必须像这样在 kebab-case 中传递它:

<div class="panel panel-default panel-store-info">
    ...
    <div id="app">
        <AddFavoriteProduct id-product="4"></AddFavoriteProduct>
    </div>
    ....
</div>

【讨论】:

【解决方案3】:

HTML 不区分大小写,因此您的自定义按钮元素 &lt;AddFavoriteProduct&gt;&lt;/AddFavoriteProduct&gt; 被解释为您的 Vue 警告报告:&lt;addfavoriteproduct&gt;

当您使用 camelCase 或 PascalCase 命名您的组件时,您应该在标记中使用的相应标签名称应该是 kebab-cases ,如下所示: &lt;add-favorite-product&gt;&lt;/add-favorite-product&gt;

Vue 知道将“破折号”转换为“大写字母”。

【讨论】:

    【解决方案4】:

    我不习惯vuex,因为我通常将自己的商店实现为 POJO 对象 - 没有随着 vuex 的学习曲线毕业。因此无法使用 vuex 提供有效的解决方案,但是据我所知,您需要在组件中导入操作 - 您可以尝试以下操作

    <template>
    <a href="javascript:" class="btn btn-block btn-success" @click="addFavoriteProduct({{ $product->id }},  $event)">
        <span class="fa fa-heart"></span>&nbsp;Favorite
    </a>
    </template>
    
    <script>
        export default{
            props:['idProduct'],
            vuex: {
                actions: {
                    setFavoriteProduct: setFavoriteProduct
                    // assuming you named the action as setFavoriteProduct in vuex
                    // avoid duplicate naming for easy debugging
                }
            }
            methods:{
                addFavoriteProduct(productId, event){
                    event.target.disabled = true
                    const payload= {id_product: this.idProduct}
                    // this.$store.dispatch('addFavoriteProduct', payload)
                    this.setFavoriteProduct(payload);
                    setTimeout(function () {
                        location.reload(true)
                    }, 1500);
                }
            },
        }
    

    注意:从 Vuex2 开始,store.dispatch() 只接受一个参数(对于您当前的用例来说不是问题),但是如果您需要将多个参数传递给您的操作,您可以像

    store.dispatch('setSplitData',[data[0], data [1]])
    
    // in the action:
    setSplitData (context, [data1, data2]) { // uses ES6 argument destructuring
    
        OR
    
    //... with an object:
    store.dispatch('setSplitData',{ 
      data1: data[0], 
      data2: data [1],
    })
    
    // in the action:
    setSplitData (context, { data1, data2 }) { // uses ES6 argument destructuring
    //source: LinusBorg's comment at https://github.com/vuejs/vuex/issues/366
    

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2018-07-18
      • 2014-05-13
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多