17.插槽与自定义事件(插槽是为了确定组件摆放的位置)

 

1.新建一个项目文件夹“插槽”
2.在“插槽"文件夹下创建index.html
3.index.html内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue.js-->
    <title>Vue插槽</title>
</head>
<body>
    <!--MVVM中,view层只能通过viewmodel来对接model,即只能展示viewmodel中的内容,不能直接展示model中的内容-->
    <!--view展示层-->
    <div id="app">
        <!--显示data中的数据-->
        <!--使用组件todo-->
        <todo>
            <!--使用todo-title组件,-->
            <!--todo组件中使用slot(插槽),插入组件todo-title-->
            <!--使用v-bind,将data中title变量值传入到组件todo-title中-->
            <todo-title slot="todo-title" v-bind:title="title"></todo-title>
            <!--先使用v-for,遍历leixinglist的内容,给leixingone,在通过v-bind将leixingone赋值给contentone,进而传入到插件todo-contentone的变量contentone中使用-->
            <todo-contentone slot="todo-contentone" v-for="leixingone in leixinglist" v-bind:contentone="leixingone"></todo-contentone>
        </todo>

    </div>

    <div><slot name="todo-title"></slot><ul><slot name="todo-todo-contentone"></slot></ul></div>

    <!--viewmodel脚本控制层-->
    <script>
        //定义一个组件
        //第一个参数为组件的名字
        //第二个参数为组件的内容
        //第二个参数中的template,为html显示层的模板
        //定义待办事项组件
        Vue.component("todo",{
            template:'<div><slot name="todo-title"></slot><ul><slot name="todo-contentone"></slot></ul></div>'   //模板中使用了插槽slot
        })

        //定义待办事项标题组件
        Vue.component("todo-title",{
            props:["title"],   //组件中传入的变量不能被template中的内容直接使用,需要用props来获取变量,然后再在template中使用
            template:' <div>{{title}}</div>'   //模板中使用组件中传入的zujianleixingone的变量参数
        })

        //定义待办事项内容组件
        Vue.component("todo-contentone",{
            props:["contentone"],   //组件中传入的变量不能被template中的内容直接使用,需要用props来获取变量,然后再在template中使用
            template:' <li>{{contentone}}</li>'   //模板中使用组件中传入的zujianleixingone的变量参数
        })


        //Vue(),就是viewModel层的内容
        var app = new Vue({
            el: '#app', //el为element的缩写,挂载元素
            data: {  //这个data,就是model层,即数据内容
                title:"分类",
                leixinglist:["美女","帅哥","萝莉","御姐"]

            }
        })
    </script>
</body>
</html>

 

18.自定义事件

1.在子组件中定义一个事件remove
2.这个事件会通过this.$emit("remove1"),调用一个自定义事件"remove1"
3.这个自定义事件会调用函数removeone(index),需要传入index
4.可以通过 v-for="(leixingone,index) in leixinglist"来获取index
5.在使用index前,要先用v-bind:index="index" 来绑定一个index变量
6.点击子组件的按钮,完成删除父组件中的内容

index.html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue.js-->
    <title>Vue插槽</title>
</head>
<body>
    <!--MVVM中,view层只能通过viewmodel来对接model,即只能展示viewmodel中的内容,不能直接展示model中的内容-->
    <!--view展示层-->
    <div id="app">
        <!--显示data中的数据-->
        <!--使用组件todo-->
        <todo>
            <!--使用todo-title组件,-->
            <!--todo组件中使用slot(插槽),插入组件todo-title-->
            <!--使用v-bind,将data中title变量值传入到组件todo-title中-->
            <todo-title slot="todo-title" v-bind:title="title"></todo-title>
            <!--先使用v-for,遍历leixinglist的内容,给leixingone,在通过v-bind将leixingone赋值给contentone,进而传入到插件todo-contentone的变量contentone中使用-->
            <!--5.此处自定义一个事件remove1,此事件为调用外部函数removeone-->
            <!--8.用v-for="(leixingone,index) in leixinglist",可以获取index-->
            <!--9.v-bind:index="index",将要使用的index进行绑定,才能使用-->
            <todo-contentone slot="todo-contentone" v-for="(leixingone,index) in leixinglist" v-bind:contentone="leixingone" v-bind:index="index" v-on:remove1="removeone(index)"></todo-contentone>
        </todo>

    </div>


    <!--viewmodel脚本控制层-->
    <script>
        //定义一个组件
        //第一个参数为组件的名字
        //第二个参数为组件的内容
        //第二个参数中的template,为html显示层的模板
        //定义代办事项组件
        Vue.component("todo",{
            template:'<div><slot name="todo-title"></slot><ul><slot name="todo-contentone"></slot></ul></div>'   //模板中使用了插槽slot
        })

        //定义代办事项标题组件
        Vue.component("todo-title",{

            props:["title"],   //组件中传入的变量不能被template中的内容直接使用,需要用props来获取变量,然后再在template中使用
            template:' <div>{{title}}</div>'   //模板中使用组件中传入的zujianleixingone的变量参数
        })

        //定义代办事项内容组件
        Vue.component("todo-contentone",{
            //10.props中也要添加"index"
            props:["contentone","index"],   //组件中传入的变量不能被template中的内容直接使用,需要用props来获取变量,然后再在template中使用
            //2-用v-on:click绑定一个点击事件
            //3-@click就等于v-on:click
            //11.{{index}},使用index
            template:' <li>{{index}}---{{contentone}}<button v-on:click="remove">删除1</button><button @click="remove">删除2</button></li>',   //模板中使用组件中传入的zujianleixingone的变量参数
            methods:{  //1-在组件中写一个方法
                remove:function () {
                    // alert(1)
                    this.$emit("remove1")   //6.使用this.$emit绑定自定义事件remove1
                }
            }
        })


        //Vue(),就是viewModel层的内容
        var app = new Vue({
            el: '#app', //el为element的缩写,挂载元素
            data: {  //这个data,就是model层,即数据内容
                title:"分类",
                leixinglist:["美女","帅哥","萝莉","御姐"]
            },
            methods: { //4-组件外定义一个事件
                removeone:function (index) {
                    alert("hello")
                    //7.删除leixinglist中的数据
                    this.leixinglist.splice(index,1)   //splice第一个参数为要删除的index,第二个参数为0,表示不删除,为1,表示删除一个,为2表示删除两个...
                }
            }
        })
    </script>
</body>
</html>

19.vue-cli使用

posted on 2022-07-10 12:04  大话人生  阅读(138)  评论(0编辑  收藏  举报