vue.js_08_vue-组件的定义

1.vue组件常用定义方式

<body>
        <div id="app">
            <!--1.3使用组件-->
            <mycom1></mycom1>
            <mycom2></mycom2>
            <mycom3></mycom3>
        </div>
        <template id="mycom3">
            //只能有一个 根元素
            <div>
                <h3>这是使用Vue 创建的模板组件</h3>
            </div>
        </template>
        <script>
            Vue.component('mycom1', {
                //只能有一个 根元素
                template: '<div><h3>这是使用Vue 创建的全局组件</h3></div>'
            })
            var vm = new Vue({
                el: '#app',
                data: {},
                methods: {},
                components: {
                    mycom2: {
                        //只能有一个 根元素
                        template: '<div><h3>这是使用Vue 创建的私有组件</h3></div>'
                    },
                    mycom3: {
                        template: '#mycom3'
                    }
                }
            })
        </script>
    </body>

 

2.组件中的data和methods

<div id="app">
            <count></count>
            <hr />
            <count></count>
            <hr />
            <count></count>
        </div>
        <template id="tpl1">
            <div>
                <input type="button" value="+1" @click="incrment" />
                <h3>{{count}}</h3>
            </div>
        </template>

        <script>
            Vue.component('count', {
                template: '#tpl1',
                data: function() {
                    return {
                        count: 0
                    }
                },
                methods: {
                    incrment() {
                        this.count++
                    }
                },
            });
            var vm = new Vue({
                el: '#app',
                data: {},
                methods: {},
            });
        </script>
    </body>

 3.vue组件之间的切换

<body>
        <div id="app">
            <a href="" @click.prevent="comName='login'">登陆</a>
            <a href=""  @click.prevent="comName='register'">注册</a>
            <!-- component是一个占位符 :is 属性,可以用来指定要展示的组件的名称 -->
            <component :is="comName"></component>
        </div>
        <script>
            Vue.component('login',{
                template:'<h3>登陆组件<h3>'
            });
            Vue.component('register',{
                template:'<h3>注册组件<h3>'
            });
            
            var vm = new Vue({
                el: '#app', 
                data: {
                    comName:'login',
                },
                methods:{}
            })
        </script>
    </body>

4.vue父子组件之间对象的传递

  1>通过 属性绑定(v-bind:)的形式将对象传递给子组件

  <com1 v-bind:parentmsg="msg"></com1>

  将父组件中data中的msg属性传递给子组件

  子组件必须用 props: ['parentmsg'],来接收

<body>
    <div id="app">
        <!-- 父组件 通过 属性绑定(v-bind:)的形式,把需要传递给子组件,以属性绑定的形式,传递到子组件内部,供子组件使用 -->
        <com1 v-bind:parentmsg="msg"></com1>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '123,这是父组件中的数据'
            },
            methods: {},
            
            components: {
                com1: {
                    data() {
                        //组件中的data数据都是,组件私有的,比如:子组件动过ajax,请求回来的数据,都可以放到data上。是可读可写的
                        return {
                            title: '123',
                            content: 'qqq'
                        }
                    },
                    //默认子组件是无法访问父组件中的data和methods
                    template: '<h1>这是子组件----{{parentmsg}}</h1>',
                    // 把父组件传递过来的 parentmsg属性接受 
                    //props这个数据是只读的
                    props: ['parentmsg'],
                }
            }
        })
    </script>
</body>

5.vue父子组件之间的方法的传递

  1>父组件向子组件传递方法 用的是事件绑定 v-on:

    <com1 @func="show"></com1>

   //当点击子组件的按钮的时候,如何拿到 父组件传递过来的额func方法
    //调用父组件 @func绑定的方法 并传递参数 this.$emit('func', this.son)
<body>
    <div id="app">
        <!-- 父组件向子组件传递方法 用的是事件绑定 v-on: -->
        <com1 @func="show"></com1>
    </div>

    <template id="tmpl">
        <div>
            <h1>这是子组件</h1>
            <input type="button" value="这是子组件中的按钮-点击它触发父组件传递过来的fun方法" @click="myclick">
        </div>
    </template>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                datason:null
            },
            methods: {
                show(data) {
                    console.log('调用了父组件身上的show方法--' + data),
                    this.datason=data
                },

            },
            components: {
                com1: {
                    template: '#tmpl',
                    data() {
                        return {
                            son: { name: '大头儿子', age: 5 }
                        }
                    },
                    methods: {
                        myclick() {
                            //当点击子组件的按钮的时候,如何拿到 父组件传递过来的额func方法
                            //调用父组件 @func绑定的方法 并传递参数
                            this.$emit('func', this.son)
                        }
                    }
                },

            }
        })
    </script>
</body>

6.veu中DOM元素的获取

<h3 id="h3" ref="myh3">哈哈哈,今天天气太好了!!!</h3>
设置要获取的dom元素的ref
console.log(this.$refs.myh3.innerHTML)
<body>
        <div id="app">
            <h3 id="h3" ref="myh3">哈哈哈,今天天气太好了!!!</h3>
            <input type="button" value="获取元素" @click="getElement" />
            <com1 id="com1"  ref="com1"></com1>
        </div>
        <script>
            Vue.component('com1',{
                template:'<h3>我是com1组件</h3>',
                data(){
                    return {
                        msg:'msg'
                    }
                }
            })
            var vm = new Vue({
                el: '#app', 
                data: {},
                methods:{
                    getElement(){
                        //$refs获取DOM元素
                        console.log(this.$refs.myh3.innerHTML)
                        console.log(this.$refs.com1.msg)
                    }
                }
            })
        </script>
    </body>


猜你喜欢

转载自www.cnblogs.com/asndxj/p/11703955.html