深刻理解Vue中的组件(2)--进阶篇github链接 (demo05持续更新中)

学习了基本的组件构成,来写一个简单的小demo,学生信息的收集功能,首先页面分成了三种不同的组件:分别是 demo05CommentInputCommentList
CommentInput
CommentInput负责收集数据,并传递给父组件demo05 ,通过双向数据绑定(v-model),收集学生姓名、学生学号、学生个人信息

<template>
    <div class="com-input">
        学生姓名:
        <input type="text" v-model="userName">
        <br> 学生学号:
    <input type="text" v-model="userCode">
    <br> 学生个人信息:
    <textarea name="" id="" cols="30" rows="10" v-model="userInfo"></textarea>
    <br>
    <el-button round @click="_handleClick()">圆角按钮</el-button>
</div>

点击时,传递给父组件

    methods: {
        //点击按钮 通过 emit ,把数据传递给父组件 demo05
        _handleClick() {
            let params = {
                userName: this.userName,
                userCode: this.userCode,
                userInfo: this.userInfo
            };
            this.$emit('sendMsg',params)
        }
    },

demo05

demo05作为父组件,用于接收学生信息,并传递给CommentList

<template>
    <div class="hello">
        {{msg}}

        <div class="submit-box">
            <!--上面部分是负责用户输入可操作的输入区域,包括输入评论的用户名、评论内容和发布按钮,这一部分功能划分到一个单独的组件 CommentInput 中。-->
            <comment-input  @sendMsg="_handleInputMsg"/>
            <!--下面部分是评论列表-->
            <comment-list :message="comList" @delInfo="_delInfoList"/>
        </div>
    </div>
</template>

CommentList
CommentList通过props接受从父组件中传递的信息,并通过(v-for)展示在页面中。

<template>
    <div class="hello">
        <ul>
            <li v-for="(item,index) in message" :key="item.id">{{item.userName}}--{{item.userCode}}--{{item.userInfo}} <span @click="_handleDel(index)">删除</span></li>
        </ul>
    </div>
</template>

添加一个删除功能,把索引值(index)传递给父组件

    _handleDel(index) {
        this.$emit('delInfo', index)
    }

这样通过父组件与子组件之间的参数传递,就实现了学生信息收集与删除功能

demo05源码
<template>
    <div class="hello">
        {{msg}}

        <div class="submit-box">
            <!--上面部分是负责用户输入可操作的输入区域,包括输入评论的用户名、评论内容和发布按钮,这一部分功能划分到一个单独的组件 CommentInput 中。-->
            <comment-input  @sendMsg="_handleInputMsg"/>
            <!--下面部分是评论列表-->
            <comment-list :message="comList" @delInfo="_delInfoList"/>
        </div>
    </div>
</template>
<script>
    import commentInput from './children/CommentInput.vue';
    import commentList from './children/CommentList.vue';
    export default {
        name: "Demo05",
        data() {
            return {
                msg: "demo05 -- 深刻理解Vue中的组件(2)--进阶篇",
                comList:[
                    
                ]
            };
        },
        created() {},
        mounted: function() {
            this.$nextTick(function() {
                
            });
        },
        components: {
            commentInput,
            commentList
        },
        methods: {
            //从子组件 CommentInput 获取 采集数据,再传递给 子组件 CommentList 
            _handleInputMsg(data) {
                this.comList.push(data);
            },
            //从子组件 CommentList 获取 index ,删除 this.comList 中的数据
            _delInfoList(index){
                this.comList.splice(index, 1)
            }
        }
    };
</script>
<style scoped lang="less">
    .submit-box{
        min-height: 600px;
        width: 700px;
        border: 1px solid #cccccc;
    }
</style>
commentInput源码
<template>
    <div class="com-input">
        学生姓名:
        <input type="text" v-model="userName">
        <br> 学生学号:
        <input type="text" v-model="userCode">
        <br> 学生个人信息:
        <textarea name="" id="" cols="30" rows="10" v-model="userInfo"></textarea>
        <br>
        <el-button round @click="_handleClick()">圆角按钮</el-button>
    </div>
</template>

<script>
    export default {
        name: "Demo01",
        data() {
            return {
                userName: '',
                userCode: '',
                userInfo: ''
            };
        },
        created() {},
        methods: {
            //点击按钮 通过 emit ,把数据传递给父组件 demo05
            _handleClick() {
                let params = {
                    userName: this.userName,
                    userCode: this.userCode,
                    userInfo: this.userInfo
                };
                this.$emit('sendMsg',params)
            }
        },
        mounted: function() {
            this.$nextTick(function() {
    
            });
        },
    };
</script>

<style scoped lang="less">
    .com-input {
        border-bottom: 1px slateblue solid;
    }
</style>


CommentList源码
<template>
    <div class="hello">
        <ul>
            <li v-for="(item,index) in message" :key="item.id">{{item.userName}}--{{item.userCode}}--{{item.userInfo}} <span @click="_handleDel(index)">删除</span></li>
        </ul>
    </div>
</template>

<script>
    export default {
        name: "Demo01",
        data() {
            return {
                person: {
    
                }
            };
        },
        created() {},
        //从demo05 父组件中获取 数据,并展示
        props: ['message'],
        methods: {
            
            _handleDel(index) {
                this.$emit('delInfo', index)
            }
        },
        mounted: function() {
            this.$nextTick(function() {
    
            });
        },
    };
</script>

<style scoped lang="less">
    .hello {
        height: 200px;
        h2 {
            background: #dcdc3e;
        }
    }
</style>


zhanglingning
68 声望16 粉丝

做一个纯粹的程序员