Hello_World!!!

导航

 

组件:可复用的代码可以封装成一个组件,多个组件一起构建成一个大应用

如何使用:

  1. 组件的注册
  2. 组件的事件(原生dom的事件,自定义组件的事件)
  3. 插槽:分发内容,需要往自定义组件中传递内容,但又不能通过属性传递时使用,主要有默认插槽,名称插槽,作用于插槽

组件的定义以及使用demo如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">{{message}}
        <ul>
            <!-- 自定义组件的使用 -->
            <!-- @delete是自定义组件中定义的事件 -->
            <todo-item v-for="item in list" :title="item.title" :del="item.del" @delete=handleDelete></todo-item>
        </ul>

    </div>
    <!-- 使用vue有两种方式,一种是引用cdn地址,一种是npm安装 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 组件的注册,第一个参数是组件名称,不能重复
        Vue.component('todo-item', {
            // 动态属性
            props: {
                title: String,
                del: {
                    type: Boolean,
                    // 为动态属性设置默认值
                    default: false
                }
            },
            // 模板,可以在模板中,添加事件
            template: `
            <li>
                <span v-if="!del">{{title}}</span>
                <span v-else style="text-decoration: line-through;">{{title}}</span>
                <button v-show="!del" @click=handleClick>删除</button>
            </li>
            `,
            data: function () {
                return {}
            },
            // 具体的方法
            methods: {
                // 模板内部的方法,如果希望外部可以调用$emit
                handleClick() {
                    console.log("test handleClick:点击删除");
                    this.$emit('delete', this.title)
                }
            }
        })
        var vm = new Vue({
            el: '#app',
            data: {
                message: 'hello world',
                item: {
                    title: '语文',
                    del: true
                },
                list: [
                    {
                        title: '语文',
                        del: false
                    },
                    {
                        title: '数学',
                        del: true
                    },
                    {
                        title: '英语',
                        del: true
                    }
                ]
            },
            methods: {
                // val的值是自定义组件中传过来的值
                handleDelete(val) {
                    console.log("handleDelete:", val);
                }
            }
        })
    </script>
</body>

</html>

插槽demo:

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">{{message}}
        <todo-list>
            <!-- 使用默认插槽 -->
            <todo-item v-for="item in list" :title="item.title" :del="item.del" @delete=handleDelete>
                <!-- 旧版写法 -->
                <span name="pre_slot">前置插槽</span>

                <!-- 名称插槽,新版写法 -->
                <template v-slot:pre_slot="{value}">
                    <span>前置插槽{{value}}</span>
                </template>
                <template v-slot:suf_slot="{value}">
                    <span>后置插槽{{value}}</span>
                </template>
            </todo-item>
        </todo-list>
    </div>
    <!-- 使用vue有两种方式,一种是引用cdn地址,一种是npm安装 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 组件的注册,第一个参数是组件名称,不能重复
        Vue.component('todo-item', {
            // 动态属性
            props: {
                title: String,
                del: {
                    type: Boolean,
                    // 为动态属性设置默认值
                    default: false
                }
            },
            // 模板,可以在模板中,添加事件
            template: `
            <li>
                <slot name="pre_slot" :value="value"></slot>
                <span v-if="!del">{{title}}</span>
                <span v-else style="text-decoration: line-through;">{{title}}</span>
                <slot name="suf_slot">默认值</slot>
                <button v-show="!del" @click=handleClick>删除</button>
            </li>
            `,
            data: function () {
                return {
                    value: Math.random()
                }
            },
            // 具体的方法
            methods: {
                // 模板内部的方法,如果希望外部可以调用$emit
                handleClick() {
                    console.log("test handleClick:点击删除");
                    this.$emit('delete', this.title)
                }
            }
        })
        Vue.component('todo-list', {
            template: `
            <ul>
            <slot></slot>
        </ul>
            `,
            data: function () {
                return {
                }
            },
            methods: {
            }
        })
        var vm = new Vue({
            el: '#app',
            data: {
                message: 'hello world',
                item: {
                    title: '语文',
                    del: true
                },
                list: [
                    {
                        title: '语文',
                        del: false
                    },
                    {
                        title: '数学',
                        del: true
                    },
                    {
                        title: '英语',
                        del: true
                    }
                ]
            },
            methods: {
                // val的值是自定义组件中传过来的值
                handleDelete(val) {
                    console.log("handleDelete:", val);
                }
            }
        })
    </script>
</body>

</html>

 

posted on 2021-02-14 16:56  Hello_World!!!  阅读(116)  评论(0编辑  收藏  举报