• 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>
  • 相关阅读:
    []*T *[]T *[]*T 傻傻分不清楚
    Linux设备树
    gdb使用
    LockBit 2.0 勒索软件全球肆虐,我们该如何防范?
    记一次粗浅的钓鱼样本分析过程
    部分sql注入总结
    Linux系统取证简述
    对抗样本攻击及防御实战
    区块链是否真的安全?黑客盗取价值6亿美金数字货币
    某团购CMS的SQL注入漏洞代码审计
  • 原文地址:https://www.cnblogs.com/bao2333/p/10151800.html
Copyright © 2020-2023  润新知