zoukankan      html  css  js  c++  java
  • vue父子组件传值

    父子组件

    1.父组件往子组件传值(常用)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <App></App>
    </div>
    <script src="vue.js"></script>
    <script>
    
        //子组件2
        //第一步:生子2  挂子往App里挂, 不需要挂Vue里
        let Vheader = {//对象
            data(){
                return {}
            },
    
             //第一步(传值的 ): 子组件挂载父组件的属性props 挂载之后就可以在子组件内部使用父组件传过来的数据了*****
    
            props:["msg","post"],
            //template 是一个组件模板,一定要用一个根(父)元素包裹起来,所以一定要有一个div闭合****
            //第三步(传值):展示父组件传来的值
            template:`
            <div>
                <h2>生子是在子组件中</h2>
                <h2 style="color:red">挂子和用子是在父组件中</h2>
                <h3>{{msg}}</h3>
                <h3>{{post.title}}</h3>
    
            </div>
            `,
        };
    
    
        //第一步:  声子   Vue中组件的首字母要大写, 跟标签区分
        //组件中的data必须是个函数,一定要有返回值
        let App = { //跟的是一个对象  这个对象里 就是除了下面的Vue中,el以外的所有属性
            data() {
                // 父-->子传值 通过props 属性
                // post传入一个对象的多个属性
                return {
                    text: "我是Vheader的父组件,想把数据传过去",
                    post:{
                        id:1,
                        title:"My journey with Vue"
                    }
                }
            },
    
            //第四步:  给子组件里写内容.  当前模板里的标签,只用当前数据属性跟下面的根组件Vue没有关系
            //在<h2>{{text}}</h2>中的{{text}}部分可以放头部组件,内容组件和侧边栏组件 ************
            // 第三步:用子2   <Vheader></Vheader>,  下一步去对应模板Vheader的template里写内容
    
            //第二步(传值的): 父组件中通过v-bind绑定自定义属性,  在Vheader定义自定义的属性 :msg 这个msg一定是跟子组件里的props:["msg"]一样***
            // 传入一个对象的多个属性用post
            template: `
            <div id="a">
    
                <Vheader v-bind:msg="text" v-bind:post="post"></Vheader>
    
            </div>
            `,
            //给子组件定义方法  比如说a标签的超链接
            methods:{
            },
            components:{
                // 第二步:挂子2
                Vheader
            },
        }
    
        new Vue({
            el: "#app",  //绑定根元素  是上面的id="app"
            data() {
                return {msg: "alex"}
            },
    
            components: {
                // 第二步:   挂子 父组件Vue里不仅是可以挂载一个App,还可以挂载其他组件
                App   //如果key和value一样,可以只写App 替代App:App
    
            }
        })
    </script>
    </body>
    </html>
    
    • 其他方法

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <div id="app">
          <App></App>
      </div>
      <script src="vue.js"></script>
      <script>
          //声明一个全局组件  Vbtn组件
          Vue.component("Vbtn",{
              data(){
                  //return的返回值是传给父组件func_clickHandler()的???
                  return{}//props:["id"] 声明完就相当于在return里绑定了
              },
              template:`<button @click="clickHandler">
                  {{id}}
                  </button>`,
              // 传过来的值id
              props:["id"],//声明之后可以在任何地方用,比如在模板中通过{{id}}可以获取,在method里通过this.id获取
              methods:{
                  clickHandler(){ //这个方法出发父组件里的内容
                      console.log(this);// 谁调用的这个函数,this就是谁,这里是Vbtn. 每个组价中的this指当前组件对象 *****
                      this.id++
                      //this.$emit("触发父组件中声明的事件","传值")*****
                      //第二步:在子组件中通过$emit 触发父组件里绑定的自定义事件@clickHandler
                      this.$emit("clickHandler",this.id);
                  }
              }
          })
      
          let Vheader = {//对象
              data(){
                  return {}
              },
              props:["msg","post"],
      
              // 第一步:先在父组件里自定义一个触发事件@clickHandler
              template:`
              <div>
                  <h2>我是header组件</h2>
                  <h2>生子是在子组件中</h2>
                  <h2 style="color:red">挂子和用子是在父组件中</h2>
                  <h3>{{msg}}</h3>
                  <h3>{{post.title}}</h3>
      
                  <Vbtn v-bind:id="post.id" @clickHandler="func_clickHandler"></Vbtn>
              </div>
              `,
              methods:{
                  func_clickHandler(val){
                      alert(val)
                      this.$emit("fatherheader",val)
                  }
              }
          }
      
      
          let App = { //跟的是一个对象  这个对象里 就是除了下面的Vue中,el以外的所有属性
              data() {
                  // 父-->子传值 通过props 属性
                  // 传入一个对象的多个属性post
                  return {
                      text: "我是Vheader的父组件,想把数据传过去",
                      post:{
                          id:1,
                          title:"My journey with Vue"
                      }
                  }
              },
      
              template: `
              <div id="a">
                  我是父组件的{{post.id}}
                  <Vheader v-bind:msg="text" v-bind:post="post" @fatherheader="father_header"></Vheader>
              </div>
              `,
              //给子组件定义方法  比如说a标签的超链接
              methods:{
                  father_header(val){
                      this.post.id=val  //修改完数据对应的 我是父组件的{{post.id}}里的数据跟着修改
                  }
              },
              components:{
                  // 第二步:挂子2
                  Vheader
              },
          }
      
          new Vue({
              el: "#app",  //绑定根元素  是上面的id="app"
              data() {
                  return {msg: "alex"}
              },
      
              components: {
                  // 第二步:   挂子 父组件Vue里不仅是可以挂载一个App,还可以挂载其他组件
                  App   //如果key和value一样,可以只写App 替代App:App
      
              }
          })
      </script>
      </body>
      </html>
      

    2.子往父组件传值

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <App></App>
    </div>
    <script src="vue.js"></script>
    <script>
        //声明一个全局组件  Vbtn组件
        Vue.component("Vbtn",{
            data(){
                //return的返回值是传给父组件func_clickHandler()的???
                return{}//props:["id"] 声明完就相当于在return里绑定了
            },
            template:`<button @click="clickHandler">
                {{id}}
                </button>`,
            // 传过来的值id
            props:["id"],//声明之后可以在任何地方用,比如在模板中通过{{id}}可以获取,在method里通过this.id获取
            methods:{
                clickHandler(){ //这个方法出发父组件里的内容
                    console.log(this);// 谁调用的这个函数,this就是谁,这里是Vbtn. 每个组价中的this指当前组件对象 *****
                    this.id++
                    //this.$emit("触发父组件中声明的事件","传值")*****
                    //第二步:在子组件中通过$emit 触发父组件里绑定的自定义事件@clickHandler
                    this.$emit("clickHandler",this.id);
                }
            }
        })
    
        let Vheader = {//对象
            data(){
                return {}
            },
            props:["msg","post"],
    
            // 第一步:先在父组件里自定义一个触发事件@clickHandler
            template:`
            <div>
                <h2>我是header组件</h2>
                <h2>生子是在子组件中</h2>
                <h2 style="color:red">挂子和用子是在父组件中</h2>
                <h3>{{msg}}</h3>
                <h3>{{post.title}}</h3>
    
                <Vbtn v-bind:id="post.id" @clickHandler="func_clickHandler"></Vbtn>
            </div>
            `,
            methods:{
                func_clickHandler(val){
                    alert(val)
                    this.$emit("fatherheader",val)
                }
            }
        }
    
    
        let App = { //跟的是一个对象  这个对象里 就是除了下面的Vue中,el以外的所有属性
            data() {
                // 父-->子传值 通过props 属性
                // 传入一个对象的多个属性post
                return {
                    text: "我是Vheader的父组件,想把数据传过去",
                    post:{
                        id:1,
                        title:"My journey with Vue"
                    }
                }
            },
    
            template: `
            <div id="a">
                我是父组件的{{post.id}}
                <Vheader v-bind:msg="text" v-bind:post="post" @fatherheader="father_header"></Vheader>
            </div>
            `,
            //给子组件定义方法  比如说a标签的超链接
            methods:{
                father_header(val){
                    this.post.id=val  //修改完数据对应的 我是父组件的{{post.id}}里的数据跟着修改
                }
            },
            components:{
                // 第二步:挂子2
                Vheader
            },
        }
    
        new Vue({
            el: "#app",  //绑定根元素  是上面的id="app"
            data() {
                return {msg: "alex"}
            },
    
            components: {
                // 第二步:   挂子 父组件Vue里不仅是可以挂载一个App,还可以挂载其他组件
                App   //如果key和value一样,可以只写App 替代App:App
    
            }
        })
    </script>
    </body>
    </html>
    
  • 相关阅读:
    83. Remove Duplicates from Sorted List
    35. Search Insert Position
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    111. Minimum Depth of Binary Tree
    169. Majority Element
    171. Excel Sheet Column Number
    190. Reverse Bits
  • 原文地址:https://www.cnblogs.com/bigox/p/11630012.html
Copyright © 2011-2022 走看看