欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue-父子组件和ref

程序员文章站 2022-05-18 20:25:01
父组件向子组件传值 父组件向子组件传方法 vue+本地存储实现评论功能 难道在于理解父组件向子组件传方法 ref获取DOM和组件 vue中如何操作DOM ......

父组件向子组件传值

 <div id="app">
    <!-- 父组件,可以在引用子组件的时候, 通过 属性绑定(v-bind:) 的形式, 把 需要传递给 子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用 -->
    <com1 v-bind:parentmsg="msg"></com1>
  </div>
// 创建 vue 实例,得到 viewmodel
    var vm = new vue({
      el: '#app',
      data: {
        msg: '123 啊-父组件中的数据'
      },
      methods: {},

      components: {
        // 结论:经过演示,发现,子组件中,默认无法访问到 父组件中的 data 上的数据 和 methods 中的方法
        com1: {
          data() { // 注意: 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 ajax ,请求回来的数据,都可以放到 data 身上;
            // data 上的数据,都是可读可写的;
            return {
              title: '123',
              content: 'qqq'
            }
          },
          template: '<h1 @click="change">这是子组件 --- {{ parentmsg }}</h1>',
          // 注意: 组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
          // props 中的数据,都是只读的,无法重新赋值
          props: ['parentmsg'], // 把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据,只读,写的话会报警告
          directives: {},
          filters: {},
          components: {},
          methods: {
            change() {
              this.parentmsg = '被修改了'
            }
          }
        }
      }
    });

父组件向子组件传方法

<div id="app">
    <!-- 父组件向子组件 传递 方法,使用的是 事件绑定机制; v-on, 当我们自定义了 一个 事件属性之后,那么,子组件就能够,通过某些方式,来调用 传递进去的 这个 方法了 -->
    <com2 @func="show"></com2>
  </div>

  <template id="tmpl">
    <div>
      <h1>这是 子组件</h1>
      <input type="button" value="这是子组件中的按钮 - 点击它,触发 父组件传递过来的 func 方法" @click="myclick">
    </div>
  </template>
 // 定义了一个字面量类型的 组件模板对象
    var com2 = {
      template: '#tmpl', // 通过指定了一个 id, 表示 说,要去加载 这个指定id的 template 元素中的内容,当作 组件的html结构
      data() {
        return {
          sonmsg: { name: '小头儿子', age: 6 }
        }
      },
      methods: {
        myclick() {
          // 当点击子组件的按钮的时候,如何 拿到 父组件传递过来的 func 方法,并调用这个方法???
          //  emit 英文原意: 是触发,调用、发射的意思
          // this.$emit('func123', 123, 456)
          this.$emit('func', this.sonmsg)
        }
      }
    }


    // 创建 vue 实例,得到 viewmodel
    var vm = new vue({
      el: '#app',
      data: {
        datamsgformson: null
      },
      methods: {
        show(data) {
          // console.log('调用了父组件身上的 show 方法: --- ' + data)
          console.log(data);
          this.datamsgformson = data
        }
      },

      components: {
        com2
        // com2: com2
      }
    });

vue+本地存储实现评论功能

难道在于理解父组件向子组件传方法

<div id="app">


    <cmt-box @func="loadcomments"></cmt-box>


    <ul class="list-group">
      <li class="list-group-item" v-for="item in list" :key="item.id">
        <span class="badge">评论人: {{ item.user }}</span>
        {{ item.content }}
      </li>
    </ul>


  </div>


  <template id="tmpl">
    <div>

      <div class="form-group">
        <label>评论人:</label>
        <input type="text" class="form-control" v-model="user">
      </div>

      <div class="form-group">
        <label>评论内容:</label>
        <textarea class="form-control" v-model="content"></textarea>
      </div>

      <div class="form-group">
        <input type="button" value="发表评论" class="btn btn-primary" @click="postcomment">
      </div>

    </div>
  </template>
var commentbox = {
      data() {
        return {
          user: '',
          content: ''
        }
      },
      template: '#tmpl',
      methods: {
        postcomment() { // 发表评论的方法
          // 分析:发表评论的业务逻辑
          // 1. 评论数据存到哪里去???   存放到了 localstorage 中  localstorage.setitem('cmts', '')
          // 2. 先组织出一个最新的评论数据对象
          // 3. 想办法,把 第二步中,得到的评论对象,保存到 localstorage 中:
          //  3.1 localstorage 只支持存放字符串数据, 要先调用 json.stringify 
          //  3.2 在保存 最新的 评论数据之前,要先从 localstorage 获取到之前的评论数据(string), 转换为 一个  数组对象, 然后,把最新的评论, push 到这个数组
          //  3.3 如果获取到的 localstorage 中的 评论字符串,为空不存在, 则  可以 返回一个 '[]'  让 json.parse 去转换
          //  3.4  把 最新的  评论列表数组,再次调用 json.stringify 转为  数组字符串,然后调用 localstorage.setitem()

          var comment = { id: date.now(), user: this.user, content: this.content }

          // 从 localstorage 中获取所有的评论
          var list = json.parse(localstorage.getitem('cmts') || '[]')
          list.unshift(comment)
          // 重新保存最新的 评论数据
          localstorage.setitem('cmts', json.stringify(list))

          this.user = this.content = ''

          // this.loadcomments() // ?????
          this.$emit('func')
        }
      }
    }

    // 创建 vue 实例,得到 viewmodel
    var vm = new vue({
      el: '#app',
      data: {
        list: [
          { id: date.now(), user: '李白', content: '天生我材必有用' },
          { id: date.now(), user: '江小白', content: '劝君更尽一杯酒' },
          { id: date.now(), user: '小马', content: '我姓马, 风吹草低见牛羊的马' }
        ]
      },
      beforecreate(){ // 注意:这里不能调用 loadcomments 方法,因为在执行这个钩子函数的时候,data 和 methods 都还没有被初始化好

      },
      created(){
        this.loadcomments()
      },
      methods: {
        loadcomments() { // 从本地的 localstorage 中,加载评论列表
          var list = json.parse(localstorage.getitem('cmts') || '[]')
          this.list = list
        }
      },
      components: {
        'cmt-box': commentbox
      }
    });

ref获取dom和组件

vue中如何操作dom

 <div id="app">
    <input type="button" value="获取元素" @click="getelement" ref="mybtn">

    <h3 id="myh3" ref="myh3">哈哈哈, 今天天气太好了!!!</h3>

    <hr>

    <login ref="mylogin"></login>
  </div>
var login = {
      template: '<h1>登录组件</h1>',
      data() {
        return {
          msg: 'son msg'
        }
      },
      methods: {
        show() {
          console.log('调用了子组件的方法')
        }
      }
    }

    // 创建 vue 实例,得到 viewmodel
    //vm中有一个属性叫ref
    var vm = new vue({
      el: '#app',
      data: {},
      methods: {
        getelement() {
          // console.log(document.getelementbyid('myh3').innertext)

          //  ref  是 英文单词 【reference】   值类型 和 引用类型  referenceerror
          // console.log(this.$refs.myh3.innertext)

          console.log(this.$refs.mylogin.msg)
          this.$refs.mylogin.show()
        }
      },
      components: {
        login
      }
    });