14Vue- 组件引入

为了扩展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>


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