• Vue组件


    Vue组件

    组件的特点

    1.组件其实就是html,css,js组成的独立单位,可以复用

    2.组件也是一个vue对象

    3.一个界面一般只有一个根组件,在它内部可以有很多的子组件

    4.html内的为真实DOM,组件的trmplate为虚拟DOM,真实的DOM会被虚拟DOM替换(根组件一般不提供template,提供了也需要在里面提供挂载点)

    一个简单组件

    案例里面的根组件有template,所以会替换掉真实的dom,并且组件中的data和methods继续对虚拟dom起作用,但是虚拟dom必须要有挂载点

    <!DOCTYPE html>
    <html>
    <head>
    	<title>VUE</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="">
            {{ msg }}
        </div>
    	<script type="text/javascript">
        let c1 = '';
        new Vue({
            el: '#app',
            data: {
                msg: '12345',
                c1: 'red'
            },
            template: `
            <div ">
                <p :style="{color: c1}">{{ msg }}</p>
                <p @click="clickAction">{{ msg }}</p>
            </div>
            `,
            methods: {
                clickAction() {
                    console.log(this.msg)
                }
            }
        })
    	</script>
    </body>
    </html>
    

    子组件

    子组件其实也是一个vue对象,所以它的结构和根组件是很相似的,但是它不需要挂载点,靠标签显示,要注意的是,创建好子组件,需要到根组件里面去注册才能使用(有两种方式如下)

    <!DOCTYPE html>
    <html>
    <head>
    	<title>VUE</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <zx></zx>
            <zx></zx>
            <zx></zx>
        </div>
    	<script type="text/javascript">
        let c1 = '';
        let zx = {
          template: `
            <p>hello !</p>
          `
        };
        new Vue({
            el: '#app',
            components:{
                zx,
            }
        })
    	</script>
    </body>
    </html>
    
        // 全局组件,不要注册就可以直接使用
        Vue.component('tag', {
            template: `
            <div>
                <p>子组件</p>
            </div>
            `,
        });
    

    父向子组件传值

    通过属性的形式向子组件传递数据

    传值的步骤

    1.在子组件的标签添加属性,绑定父组件数据

    2.然后在子组件中的props:['da']注册一下,就能在template中使用了(反射)

    3.但是要注意的是,这个数据是共享的

    子组件独立数据

    子组件中也有data,是组件独立的数据区域,要注意数据是通过返回值的方式的

    <!DOCTYPE html>
    <html>
    <head>
    	<title>VUE</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p @click="fzx">{{ msg }}</p>
            <zx :da="msg"></zx>
            <zx></zx>
            <zx :da="msg"></zx>
        </div>
    	<script type="text/javascript">
        let c1 = '';
        let zx = {
            props:['da'],
          template: `
            <p @click="fn">{{ da }} !{{ num }}</p>
          `,
            data(){
                return{
                    num:0
                }
            },
            methods:{
                fn(){
                    this.num++
                }
            }
        };
        new Vue({
            el: '#app',
            data:{
                msg:'美女你好'
            },
            components:{
                zx,
            },
            methods:{
                fzx(){
                    this.msg+=1
                }
            }
        })
    	</script>
    </body>
    </html>
    

    子向父传值

    通过发布订阅模式$emit(事件,参数)**,子组件发布一个事件,父组件之前恰好之间就已经订阅了这个事件,那么子组件就可以通过发布订阅的形式,向父组件发布数据了。

    传值步骤

    子组件的template

    1.this.$emit('f1',this.num)

    子组件真实dom

    2.<zx @f1="get_num"></zx>

    父组件的methods

    3.get_num(num){
    this.msg=num
    }

    <!DOCTYPE html>
    <html>
    <head>
    	<title>VUE</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p >{{ msg }}</p>
            <zx @f1="get_num"></zx>
        </div>
    	<script type="text/javascript">
        let c1 = '';
        let zx = {
          template: `
            <p @click="fn">{{ num }}</p>
          `,
            data(){
                return{
                    num:0
                }
            },
            methods:{
                fn(){
                    this.num++;
                    this.$emit('f1',this.num)
                }
            }
        };
        new Vue({
            el: '#app',
            data:{
                msg:'美女你好'
            },
            components:{
                zx,
            },
            methods:{
                get_num(num){
                    this.msg=num
                }
            }
        })
    	</script>
    </body>
    </html>
    
  • 相关阅读:
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    背景图
    C语言II作业01
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言I博客作业12
  • 原文地址:https://www.cnblogs.com/zx125/p/11863583.html
Copyright © 2020-2023  润新知