vue组件通信之评论

<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      box-sizing: border-box;
    }
    .form-group {
      margin-bottom: 10px
    }
    .form-group input {
      width: 100%;
      padding: 5px 10px;
    }
    .form-group textarea {
      padding: 5px 10px;      
      width: 100%;
      height: 100px;
    }
    .form-group input, .form-group textarea {
      font-size: 16px;
    }
  </style>
</head>
<body>
  <div id="app">
    <comment-app></comment-app>
  </div>
  <script src="./vue.js"></script>
  <script>
    /* 
      父子通信
      两个子父通信

      将commentApp中的comments传递给commentList

      点击commentInput中的发布按钮,将comment对象发送给commentApp (comment对象需要拷贝一个新的)

      点击commentList中的删除按钮,将index发送给commentApp (commentApp接受到之后删除对应的评论)
    
    
    */
    /* 
      CommentApp
      CommentInput
      CommentList
    
    */
    // 创建
    const CommentApp = {
      template: `
        <div>
          <CommentInput @add:comment="addComment"></CommentInput>
          <hr>
          <CommentList :comments="comments" @del:comment="delComment"></CommentList>
        </div>
      `,
      data () {
        return {
          comments: []
        }
      },
      methods: {
        addComment (comment) {
          // 我们这里的参数是comment 未来子组件就需要传一个comment
          this.comments.unshift(comment)
        },
        delComment (index) {
          console.log(index)
          this.comments.splice(index, 1)
        }
      }
    }
    // 创建CommnetInput
    const CommentInput = {
      template: `
        <div>
          <div class="form-group">
            <input type="text" v-model="comment.username">
          </div>
          <div class="form-group">
            <textarea v-model="comment.content"></textarea>
          </div>
          <div class="form-group">
            <button @click="sendComment">发布</button>
          </div>
        </div>  
      `,
      data () {
        return {
          comment: {
            username: '',
            content: ''
          }
          /* username: '',
          content: '' */
        }
      },
      methods: {
        sendComment () {
          // 调用$emit()
          /* 
            Object.assign({}, 对象)
              将对象拷贝到参数1中的{}中生成一个新的对象
          */
          // this.$emit('add:comment', JSON.parse(JSON.stringify(this.comment)))
          if (this.comment.username && this.comment.content) {
            this.$emit('add:comment', Object.assign({}, this.comment))
            this.comment.content = ""
          }
          
        }
      }
    }

    // 创建CommentList
    const CommnetList = {
      template: `
        <div>
          <div v-if="!comments.length">暂无评论</div>
          <ul v-else>
            <li v-for="(comment, index) in comments" :key="index">
              <span>{{comment.username}}</span>
              <p>{{comment.content}}</p>
              <button @click="del(index)">删除</button>
            </li>  
          </ul>
        </div>
        
      `,
      props: {
        comments: Array
      },
      methods: {
        del (index) {
          // console.log(index)
          // 触发自定义事件
          this.$emit('del:comment', index)
        }
      }
    }

    Vue.component('CommentApp', CommentApp)
    Vue.component('CommentInput', CommentInput)
    Vue.component('CommentList', CommnetList)

    const app = new Vue({
      el: '#app'
    })
  
  </script>
</body>
</html>

猜你喜欢

转载自www.cnblogs.com/bao2333/p/10151800.html