vue教程:全局组件(非单文件)-商品列表

说明

定义好 全局组件 后,可以在多个 Vue实例中使用

创建组件的步骤

  1. 定义组件
  2. 注册组件
  3. 使用组件

案例

实现下图效果:

定义组件

例子:

// 定义组件
var goods = {
    template:`
        <div>
            <img :src="path" width='100'>
            <br>
            {{name}}
            <div v-text="price"></div>
        </div>
    `, //最外面必须有且只有一个根元素,否则不显示。``是模板符号,可以换行
    data: function(){ //组件中的data,必须是函数,且返回对象.不能直接写对象,否则不可用
        return {
            name:"小天鹅洗衣机",
            price:2000,
            path:"img/iphone.jpg"
        }
    }
}

总结:

  • template:html代码,每个组件 必须有且只有一个根元素,如果 没有标签 或 有多个标签,不能正常显示,可能会提示错误
  • data:组件中的data,必须是一个函数,且返回对象,不能直接写对象

组件参数:组件是可复用的 Vue 实例,所以它们与 new Vue({}) 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。

注册全局组件

下面这种注册方式就是全局组件

Vue.component("组件名字",组件对象)

例子:

//注册组件
Vue.component( "jd-goods" , goods )

使用

全局组件可以在 <div id="app"> 里使用,也可以在 另一个组件中使用

方式一:
<div id="app" >
    <jd-goods></jd-goods>
</div>

解释: <jd-goods></jd-goods> 中的 jd-goods就是注册组件的名字

方式二:
<div id="app" >
    <jd-goods/>需要由 vue cli脚手架 或 webpark 编译后才能正常运行
</div>

完整例子

<div id="app">
    第三步:使用组件
    <jd-goods></jd-goods>

    <jd-goods></jd-goods>

    <jd-goods></jd-goods>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
        //第一步:定义组件
    var goods = {
        template:`
            <div>
                <img :src="path" width='100'>
                <br>
                {{name}}
                <div v-text="price"></div>
            </div>
        `, //最外面必须有且只有一个根元素,否则不显示。``是模板符号,可以换行
        data: function(){ //组件中的data,必须是函数,且返回对象.不能直接写对象,否则不可用
            return {
                name:"小天鹅洗衣机",
                price:2000,
                path:"img/iphone.jpg"
            }
        }
    }
    //第二步:注册组件
    Vue.component( "jd-goods" , goods )


    var vm = new Vue({
        el:'#app',//选择器: id 样式、元素选择器等  但元素选择器不能绑定body html元素
        data:{
        }
    });

</script>

总结

定义组件的好处:将功能独立,而且重复使用的代码,封装成一个组件,通过组件可以大量节省重复代码

缺点

数据时 写死在组件中,显示时,数据都是相同的

例子:多个vue实例中使用

<div id="app" >
    第三步:使用组件
    <jd-goods></jd-goods>
</div>

<div id="app2" >
    第二个vue实例
    <jd-goods></jd-goods>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
    // 第一步:定义组件
    var goods = {
        template:`
            <div>
                <img :src="path" width='100'>
                <br>
                {{name}}
                <div v-text="price"></div>
            </div>
        `, //最外面必须有且只有一个根元素,否则不显示。``是模板符号,可以换行
        data: function(){ //组件中的data,必须是函数,且返回对象.不能直接写对象,否则不可用
            return {
                name:"小天鹅洗衣机",
                price:2000,
                path:"img/iphone.jpg"
            }
        }
    }
    //第二步:注册组件
    Vue.component( "jd-goods" , goods )

    var app = new Vue({
        el: '#app',
        data: {//组件中的数据在组件的data中,所以vue中的data就为空
        }
    })

    var app = new Vue({
        el: '#app2',
        data: {//组件中的数据在组件的data中,所以vue中的data就为空
        }
    })
</script>

例子:点击事件的组件

<div id="app">
    <std-com></std-com>
    ----------------------
    <std-com></std-com>
</div>

<script>

    var std_com={
        // el:'' //组件中不能写el属性,否则报错
        template:`
            <div>
                <button @click="div">-</button>
                <input v-model='num'/>
                <button @click="add">+</button>
            </div>
            `, //最外面必须有且只有一个根元素,否则不显示。``是模板符号,可以换行
        data: function(){//组件中的data,必须是函数,且返回对象.不能直接写对象,否则不可用
            return {
                num:1,
            }
        },
        methods:{
            div:function(){
                this.num --
            },
            add:function(){
                this.num ++
            }
        }
    }

    Vue.component("std-com",std_com)


    let vue = new Vue({
        el:"#app"
    })
</script>

原文出处:/show_1IX2gxTGkahq.html