14 組件引入

爲了擴展HTML元素,封裝可重用的代碼
組件的註冊方式:
a. 全局組件:
Vue.component來創建:
Vue.component('my-component-name',{

})


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
            <script src="../../lib/vue.js"></script>
            <script src="../../lib/axios.js"></script>
    <body>
        <div id="app">
              <navbar></navbar>
                <navbar></navbar>
                  <navbar></navbar>
                  <kerwin-tabbar></kerwin-tabbar>
        </div>
        <script>
            //template 包含一個根節點
            //組件是孤島,無法直接訪問外面的組件的狀態或者方法,間接的組件通信
            //自定義的組件data 必須是一個函數
            //7 所有的組件都在一起太亂了,--vue單文件解決
            Vue.component("navbar",{
                template:
                `
                 <div style="background:red">
                   <button @click="handleBack()">返回</button>
                    <span>導航欄-{{myname}}</span>
                    <button @click="handleHome()">首頁</button>
                      <child></child>
                </div>`,
                methods:{
                    handleBack(){
                        console.log("返回按鈕");
                    },
                    handleHome(){
                        console.log("首頁")
                    }
                },
                watch:{
                    
                },
                data(){
                    return{ myname:"chile-name"}
                }
            
                
            })
            
            Vue.component("kerwinTabbar",{
                template:`
                <div style="background:red;">
                  
                  kerwinTabbar
                  <child></child>
                  <tabbarchild></tabbarchild>
                  </div>
                
                `,
                components:{
                    //局部定義
                    "tabbarchild":{
                        template:`<div>tabbarchild</div>`
                    }
                }
            })
            //定義一個孩子節點組件
            Vue.component("child",{
                template:`
                <div>child</div>
                
                `
                
            })
            
            new Vue({
                el:"#app",
                data:{
                     myname:"deefd"
                }, 
                methods:{
                    
                }
            })
        </script>
    </body>
</html>

組件父傳子:


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="../../lib/vue.js"></script>
        <script src="../../lib/axios.js"></script>
    </head>
    <body>
        <div id="app">
               <navbar :mymsg="msg"></navbar>
               <navbar ></navbar>
                <navbar ></navbar>
        </div>

<script>
    Vue.component("navbar",{
        template:
        `
         <div style="background:red">
           <button v-show="myshow" >返回</button>
            <span >導航欄-{{mytitle}}--{{mymsg}}</span>
            <button  v-show="myshow">首頁</button>
              
        </div>`,
    //  props:["mytitle","myshow"]//父組件傳遞的屬性,在這裏接收
    props:{
        mytitle:{
            type:"String",
            default:"默認名字"
        },
        myshow:{
            type:Boolean,
            default:true
        },
        mymsg:{
            type:"String",
            default:"3232"
        }
        
    }
        });
    //根組件
    new Vue({
        el:"#app",
        data:{
         msg:"323232"   
            
        },
        
    });
</script>
    </body>
</html>



子傳父

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="../../lib/vue.js"></script>
        <script src="../../lib/axios.js"></script>
    </head>
    <body>
        <div id="app">
            app
             <child @myevent="handleEvent"></child>
        </div>

<script>
    Vue.component("child",{
        template:`
        <div style="background:yellow">child
            child-<button @click="handleclick">click-child</button>
        
        </div>
        `,
        data(){
            return {
                money:10000000
            }
        },
        methods:{
            handleclick(){
                this.$emit("myevent",this.money)
            }
        }
    })
    
    new Vue({
        el:"#app",
        data:{
            
             
        },
        methods:{
            handleEvent(data){
                console.log("父組件中的定義",data);
            }
        }
        
    });
</script>
    </body>
</html>

父傳子是屬性

props:{
        mytitle:{
            type:"String",
            default:"默認名字"
        },
        myshow:{
            type:Boolean,
            default:true
        },
        mymsg:{
            type:"String",
            default:"3232"
        }
        
    }

子傳父是事件

    this.$emit()

ref傳遞

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="../../lib/vue.js"></script>
        <script src="../../lib/axios.js"></script>
    </head>
    <body>
        <div id="app">
            <input type="text" ref="mytext" />
            <button @click="handleadd">add</button>
            <child ref="mychild"></child>
        </div>

<script>
    Vue.component("child",{
        template:`
        <div style="background: yellow">child--{{childname}}</div>
        
        `,
        data(){
            return {
                childname:"222222222"
            }
        }
    })
    
    new Vue({
        el:"#app",
        data:{
            
            
        },
        methods:{
            handleadd(){
                console.log(this.$refs.mychild.childname);
                this.$refs.mychild.childname='98898';
            }
        }
        
    });
</script>
    </body>
</html>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章