vue 父子组件双向数据绑定,调用 使用ref获取原生DOM

本文介绍了Vue中父子组件之间的双向数据绑定,重点讲解了.sync属性、props的使用、$emit用于子组件更新父组件数据、$parent获取父组件、$children访问子组件以及ref属性的应用。
摘要由CSDN通过智能技术生成

父子组件之间双向数据绑定

1.父组件给子组件传参时:

在:自定义属性.sync=“传递过去的变量”自定义属性名后面加上.sync表示传递的是一个同步变量

父组件: app.vue: 点击button更改子组件msg数据

<div id="app">
    <h1>我是App父组件的内容</h1>
    <h1>父组件渲染自己的msg的值:{{msg}}</h1>
    <button @click="change">点我更改msg数据</button>
    <HelloWorld :msg.sync="msg" />
  </div>
  import HelloWorld from './components/HelloWorld.vue'

export default {
  components: {
     HelloWorld
  },
  data(){
    return{
      msg:"父组件的msg数据",
    }
  },
  methods:{
    change(){
      this.msg="新更改的值!"
    },

  }
}

2.子组件还是正常使用 props接收该变量

子组件: HelloWorld.vue:

<div class="hello">
      <h2>我是Hello子组件</h2>
    <h2>父组件的msg数据:{{msg}}</h2>
  </div>
  export default {
  props: {
      msg:{
        type:String,
        default:"我是msg默认值",
        required:false
      }
  },

3.子组件想要更改当前父组件传递多来的数据时使用:

this.$emit("update:传递多来的属性名",新更改的值)

子组件: HelloWorld.vue: 点击子组件button更改父组件的数据

<div class="hello">
      <h2>我是Hello子组件</h2>
    <h2>父组件的msg数据:{{msg}}</h2
    <button @click="change">点我改变父组件传过来的数据</button>
  </div>
  export default {
  data(){
    return{
      hehe:"我是子组件的hehe数据"
    }
  },
	 methods:{
    change(){
      this.$emit("update:msg","子组件改的hehe")
    }
  }
  }

父组件直接相互直接调用(不常用)

1.父组件直接获取子组件对象:

父组件:this.$children[索引]

索引值按照父组件的template加载顺序 为索引值顺序

拿到子组件对象就可以直接调用子组件的methods函数或者修改 自组建的data的数据

this.$children[索引值].data里面的变量

this.$children[索引].methodes里面的方法名()

父组件: app.vue: 点击改变子组件数据

<div id="app">
    <h1>我是App父组件的内容</h1>
    <h1>父组件渲染自己的msg数据:{{parent_msg}}</h1>
    <button @click="change">点我直接更改子组件数据</button>
    <HelloWorld></HelloWorld>
</div>
  import HelloWorld from './components/HelloWorld.vue'
  export default {
  components: {
    HelloWorld
  },
  data(){
    return{
      parent_msg:"父组件的msg内容"
    }
  },
  methods:{
    change(){
		this.$children[0].child_msg="父组件给你改的新值"
    }
    }
  }

子组件: HelloWorld.vue

<div class="hello">
      <h2>我是Hello子组件</h2>
    <h2>渲染msg数据:{{child_msg}}</h2>
  </div>
  export default {
  data(){
    return{
      child_msg:"子组件的msg数据"
    }
  }
  }

2.子组件直接获取父组件对象

子组员:this.$parent

调用方法:

this.$parent.data变量/methods方法

子组件: Child.vue : 点击更改父组件数据

<div id="child">
        <h2>我是Child子组件</h2>
      <button @click="change">点我修改父组件的数据</button>
    </div>
export default {
  name: "Child",
  methods:{
    change(){
      // console.log(this.$parent);
      this.$parent.parent_msg="child子组件伸手改变的新值!"
    }
  }
}

父组件: app.vue:

<div id="app">
    <h1>我是App父组件的内容</h1>
    <h1>父组件渲染自己的msg数据:{{parent_msg}}</h1>
    <Child></Child>
  </div>

ref属性的使用

1可以获取原生DOM对象、

如果ref属性是定义在原生html标签上面 那么最终获取的就是原生DOM对象

2.可以获取子组件对象

如果ref属性是定义在自定义组件标签上面 那么最终获取的就是子组件的对象
<标签 ref="自定义名字"></标签>

获取方式:

this.$refs.ref定义的名字

<div id="app">
    <h1>我是App父组件的内容</h1>
    <input type="file" id="file" ref="file">
    <button @click="getFile">点击获取file控件的dom对象</button>
    <button @click="getChild">点击获取child子组件对象</button>
    <Child ref="child"></Child>
  </div>
  import Child from "@/components/Child";
  export default {
  components: {
   Child
  },
  methods:{
    getFile(){
      // let fileDom=document.getElementById("file");
      // console.log(fileDom) 同理
      console.log(this.$refs.file)
    },
    getChild(){
      console.log(this.$refs.child);
      //获取到的是子组件的对象
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值