zoukankan      html  css  js  c++  java
  • Vue第三篇 Vue组件

    01-组件的全局注册

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <my_header></my_header>
        <my_header></my_header>
        <my_header></my_header>
        <my_header></my_header>
        <my_header></my_header>
    </div>
    <hr>
    <div id="app2">
        <my_header></my_header>
    </div>
    <script>
        Vue.component("my_header", {
            template: `<div><h1>{{title}}</h1></div>`,
            data() {
               return {
                   title: "这是头部"
               }
            },
            methods: {
    
            }
        });
        const app = new Vue({
            el: "#app"
        });
        const app2 = new Vue({
            el: "#app2"
        })
    </script>
    
    </body>
    </html>
    

     02-组件的局部注册

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <my_com></my_com>
        <my_com></my_com>
        <my_com></my_com>
        <my_com></my_com>
    </div>
    <script>
        let my_com_config = {
            template: `<div><h1>这是局部组件</h1></div>`
        };
        const app = new Vue({
            el: "#app",
            components: {
                my_com: my_com_config
            }
        })
    </script>
    
    </body>
    </html>
    

    03-子组件的注册 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <my_com></my_com>
    </div>
    <script>
        let child_config = {
            template: `<div><h2>这是一个子组件</h2></div>`
        };
        let my_com_config = {
            template: `<div>
                        <h1>这是一个组件</h1>
                        <child></child>
                        </div>
                        `,
            components:{
                child: child_config
            }
        };
        const app = new Vue({
            el: "#app",
            components: {
                my_com: my_com_config
            }
        })
    </script>
    
    </body>
    </html>
    

      

    04-父子组件通信

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <my_com></my_com>
    </div>
    <script>
        let child_config = {
            template: `<div>
                        <h2>这是一个子组件</h2>
                        <p>父亲跟你们说~~{{father_say}}</p>
                        </div>`,
            props: ["father_say"]
        };
        let my_com_config = {
            template: `<div>
                        <h1>这是一个组件</h1>
                        <child :father_say="f_say"></child>
                        </div>
                        `,
            components:{
                child: child_config
            },
            data(){
                return {
                    f_say: "滚~~"
                }
            }
        };
        const app = new Vue({
            el: "#app",
            components: {
                my_com: my_com_config
            }
        })
    </script>
    
    </body>
    </html>
    

    05-子父通信

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <my_com></my_com>
    </div>
    <script>
        let child_config = {
            template: `<div>
                        <h2>这是一个子组件</h2>
                        <button @click="my_click">点击向父亲说话</button>
                        </div>`,
            methods: {
                my_click() {
                    // 向父亲说话
                    // 子组件提交事件
                    this.$emit("son_say", "父皇,儿臣有事启奏~~")
                }
            }
        };
        let my_com_config = {
            template: `<div>
                        <h1>这是一个组件</h1>
                        <child @son_say="my_son_say
                        "></child>
                        <p>儿子跟我说~~{{say}}</p>
                        </div>
                        `,
            components:{
                child: child_config
            },
            data(){
               return {
                   say: ""
               }
            },
            methods: {
                my_son_say: function (data) {
                    this.say = data
                }
            }
        };
        const app = new Vue({
            el: "#app",
            components: {
                my_com: my_com_config
            }
        })
    </script>
    
    </body>
    </html>
    

    06-非父子通信

      

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <xiayuhao></xiayuhao>
        <yuanchengming></yuanchengming>
    </div>
    <script>
        let chenwen = new Vue();
        let xiayuhao_config = {
            template: `<div>
                        <h1>这是夏雨豪</h1>
                        <button @click="my_click">点击给袁打电话</button>
                        </div>`,
            methods: {
                my_click(){
                    // 给袁打电话 说晚上等我~~
                    // 向陈文提交事件
                    chenwen.$emit("call", "今晚等我~~~")
                }
            }
        };
        let yuanchengming = {
            template: `<div>
                            <h1>这是袁承明</h1>
                            <p>夏雨豪跟我说~~{{xia_say}}</p>
                        </div>`,
            data(){
                return {
                    xia_say: ""
                }
            },
            mounted(){
                // 组件加载完成后执行的方法
                let that = this;
                chenwen.$on("call", function (data) {
                    console.log(data)
                    that.xia_say = data
                })
            }
        };
        const app = new Vue({
            el: "#app",
            components: {
                xiayuhao: xiayuhao_config,
                yuanchengming: yuanchengming
            }
        })
    </script>
    
    </body>
    </html>
    

    07-混合

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
    
        <com1></com1>
        <com2></com2>
    
    
    </div>
    <script>
        let base = {
            data(){
                return {
                    is_show: false
                }
            },
            methods: {
                show_text(){
                    this.is_show = true
                },
                hide_text(){
                    this.is_show = false
                }
            }
        };
        let com1 = {
            template: `<div>
                    <button @click="show_text">点击显示文本</button>
                    <button @click="hide_text">点击隐藏文本</button>
                    <div v-show="is_show">夏雨豪</div>
                    </div>`,
            mixins: [base],
            data(){
                return{
                    is_show: true
                }
            }
        };
        let com2 = {
            template: `<div>
                        <button @mouseenter="show_text" @mouseleave="hide_text">提示框</button>
                        <div v-show="is_show">夏雨豪</div>
                    </div>`,
            mixins: [base]
        }
    
        const app = new Vue({
            el: "#app",
            components: {
                com1: com1,
                com2: com2
            }
        })
    </script>
    
    </body>
    </html>
    

    08-插槽

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    
    </head>
    <body>
    <div id="app">
        <com>
            <h3 slot="title">Python21天入门</h3>
            <p slot="brief">从入门到精通</p>
        </com>
        <com>
            <h3 slot="title">Mysql</h3>
            <p slot="brief">从删库到跑路</p>
        </com>
    </div>
    <template id="my_com">
        <div>
            <h1>这是一个组件</h1>
            <hr>
            <slot name="title"></slot>
            <slot name="brief"></slot>
        </div>
    </template>
    <script>
        let com = {
            template: "#my_com"
        };
        const app = new Vue({
            el: "#app",
            components: {
                com: com
            }
        })
    </script>
    
    </body>
    </html>
    

    总结:

    Vue组件
    	组件的全局注册
    		-- Vue.component("组件名称", {
    				template: `只识别一个块级作用域`,
    				data(){
    					return{
    						name: xxxx
    					}
    				},
    				methods: {},
    		})
    		-- 任何Vue实例里用 <组件名称></组件名称>
    	组件的局部注册
    		-- let com_config = {.....}
    		-- const app = new Vue({
    				el: "#app",
    				components: {
    					组件名称: com_config
    				}
    		})
    		-- <div><组件名称></组件名称></div>
    	子组件的注册
    		-- 在父组件里 components: {
    				子组件的名称: 子组件的配置信息
    		}
    		-- 在父组件的template里展示子组件
    			<child></child>
    	父子通信
    		-- 先给子组件绑定属性
    		-- 在子组件通过props:["属性名称"]
    	子父通信
    		-- 子组件先提交事件
    			this.$emit("事件名称", data)
    		-- 父组件 给子组件绑定事件
    			自己处理这个事件
    	非父子通信
    		-- 定义一个中间调度器
    			let Event = new Vue();
    		-- 其中一个组件向中间调度器提交事件
    			Event.$emit("事件名称", data)
    		-- 另一个组件要监听中间调度器里的事件
    			Event.$on("事件的名称", function(data){
    					注意this的问题
    			})
    	混合
    		-- 复用共用的代码块
    		-- mixins: [base]
    	插槽
    		-- 实现组件内容的分发
    		-- slot
    			-- 直接用slot标签
    		-- 命名的slot
    			-- 先给slot加name属性
    			-- 给标签元素添加slot属性= name属性值
    

      

      

      

      

     

  • 相关阅读:
    2021.6.7
    2021.6.4
    2021.6.3
    2021.6.2 团队第二阶段冲刺第十天
    2021.6.1 团队第二阶段冲刺第九天
    2021.5.31 团队第二阶段冲刺第八天
    2021.5.30 团队第二阶段冲刺第七天
    逻辑卷的使用
    磁盘阵列
    磁盘配额
  • 原文地址:https://www.cnblogs.com/cavalier-chen/p/10096432.html
Copyright © 2011-2022 走看看