vue

vue 学习03

2019-02-09  本文已影响1人  rainbowz

一组件

什么是组件?
组件的出现,就是为了拆分Vue实例的代码量,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。
>模块化:是将代码逻辑的角度进行划分的。方便代码分层开发,保证每次功能模块的职能单一。
>组件化:是从UI界面的角度进行划分的,前端的组件化,方便UI组件的重复调用。

 <script>
       /* var c1= Vue.extend({
            template:'<div>hey jude</div>'
        })
        Vue.component('c1',c1) */
        
        
        
        /* Vue.component('c1',Vue.extend({
            template:'<h2>hey jude!</h2>'
        })) */
        
        Vue.component('cc',{
            template:'<div><h1>兽人永不为奴!</h1><span>heyjude</span></div>'
        })
        
        let vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{
                
            },
            methods:{
                
            }
        })
    </script>

组件有且只有唯一的根元素

template:'<div><h1>兽人永不为奴!</h1><span>heyjude</span></div>'
template:'<h1>兽人永不为奴!</h1><span>heyjude</span>' F12会报错
图片.png

创建组件的方式3

全局组件
<div id='app'>
            <!-- <c1></c1> -->
            <!-- <cc></cc> -->
            <template id="t1">
                <div>
                    <p>legens never die!</p>
                    
                </div>
            </template>
        </div>

    Vue.component('zz',{
            template:'#t1'
        })
        
        
        
        
        let vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{
                
            },
            methods:{
                
            }
        })

定义私有组件

<div id="app2">
        <login></login>
        <login2></login2>
        </div>
        
        <template id="z2">
            <div style="font-size: calc(); color: #009A61;">
                <p>hello world</p>
            </div>
        </template>

<script>
            
var v1 =new Vue({
                el:'#app2',
            data:{
                
            },
            methods:{
                
            },
            components:{//定义实例内部私有组件
                login:{
                    template:"<h1>私有的login组件</h1>"
                },
                login2:{
                    template:"#z2"
                }
            }
        })
            
        </script>
图片.png

组件中的data
组件中的data必须是一个方法 这个方法还必须返回一个对象才行

<div id="app">
            <z1></z1>
</div>
<div id="app3">
            <login2>   
  无法访问 默认子组件无法访问父组件的数据
</div>

/* var v3 =new Vue({
            el:'#app3',
            components:{
                
                login2:{
                        template:'<div>不要问我从哪里来--{{msg}}</div>'
                },
                
                data:function(){
                    return {
                        msg:'我的故乡在远方'
                    }
                }
            }
        }) */

Vue.component('z1',{
            template:'<div>不要问我从哪里来--{{msg}}</div>',
            data:function(){
                return {
                    msg:'我的故乡在远方'
                }
            }
        })
            
            var vm =new Vue({
                el:'#app',
                data:{},
            })
图片.png
question:
为什么组件中的data是一个function?
组件的切换v-if component
==============================================================

父组件向子组件传值
组件中所有props的数据都是通过父组件传递给子组件的
props的数据 都是只读的 无法重新赋值
data可读可写
说白了 不要乱改你老爹的数据

<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
        
        <link rel="stylesheet" href="../demo.css"/>
<div id="app">
                <login v-bind:parentmsg="msg"></login>
                <!-- <table>
        <tr>
            <th colspan="3">父组件数据</td>
        </tr>
        <tr>
            <td>name</td>
            <td>{{ name }}</td>
            <td><input type="text" v-model="name" /></td>
        </tr>
        <tr>
            <td>age</td>
            <td>{{ age }}</td>
            <td><input type="text" v-model="age" /></td>
        </tr>
    </table> -->
                
                <login2 v-bind:name="name" v-bind:age="age"></login>
            </div>
            
                <!-- <template id="login2">
                                <table>
                    <tr>
                        <th colspan="3">
                            子组件数据
                        </th>
                    </tr>
                    <tr>
                        <td>my name</td>
                        <td>{{ name }}</td>
                        <td><input type="text" v-model="name" /></td>
                    </tr>
                    <tr>
                        <td>my age</td>
                        <td>{{ age }}</td>
                        <td><input type="text" v-model="age" /></td>
                    </tr>
                </table>
                </template>
             -->

<script>
       var v1= new Vue({
        el:'#app',
        data:{
            msg:'窗前明月光',
            name:'kobe',
            age:12
        },
        components:{
            
            
            login:{
                data(){
                        
                    return {
                        title:"4396永不为奴"
                    }
                },
                
                template:"<h3 @click='change' >子组件的数据---{{parentmsg}}+'{{title}}'</h3>",
                props:['parentmsg','xiaoming'],
                methods:{
                    change(){
                        this.parentmsg='低头思故乡'+this.title
                    }
                }
            },
            /* login2:{
                template:'#login2',
                props:['name','age']
            } */
        
        }
        
       })
    </script>
图片.png
图片.png

复习

子组件获取父组件的data 调用父组件方法

<div id="app">
                <vm v-bind:name="name" @zz="xixi" @father="haha"></vm>
                <p>{{name}}</p>
                <p>{{age}}</p>
                <p>{{sex}}</p>
</div>
        <template id="t1">
            
            <div>
                <p @click="myclick">点我</p>
                <input type="button" @click="son" value="点我2"/>
            </div>
template标签下面需要加一个div套起来,不然会报错
Component template should contain exactly one root element. If you are using
        </template>


<script>
        
        var vm={
            template:"#t1",
            props:['name','age','sex'],
            data(){
                return {
                    msg:"兽人永不为奴!"
                }
            },
            methods:{
                    myclick(){
                        console.log("子组件数据")
                        this.$emit("zz",'faker','benji')
                    },
                    son(){
                        console.log("我是儿子")
                        this.$emit("father",'KOBE')
                    }
            }
            
        }
        
        var v1=new Vue({
            el:'#app',
            data:{
                name:'兽人永不为奴',
                age:12,
                sex:'male'
            },
            methods:{
                xixi(s1,s2){
                    console.log("英雄联盟召唤师",s1,s2)
                }
                ,
                haha(s1){
                    console.log("魔兽世界召唤师",s1)
                }
            },
            components:{
                vm
            }
        })
        
        
        /* var v1 =new Vue({
            el:'#app',
            data:{
                msg:'兽人永不为奴!'
            },
            methods:{
                xixi(s1,s2){
                    console.log("唧唧复唧唧"+s1+s2)
                }
            },
            components:{
                login:{
                    template:'<h1>无问西东--{{msg}}</h1>',
                    props:['msg'],
                        
                    methods:{
                        myclick(){
                            console.log("子组件事件")
                            this.$emit("show",'6',9)
                        }
                    }
                }
            }
            
        }) */
    </script>
图片.png

2获取DOM元素

<div id="app">
            <input type="button" value="点击获取DOM元素" @click="getEle" />
            <vm id="com" ref="com" v-bind:name="name"></vm>
            <p>{{name}}</p>
            <p id="p1" ref="p1">hey jude</p>
        </div>
        <template id="t1">
            <div>
                <p>xii</p>
                
            </div>
        </template>

<script>
        var vm={
            template:'#t1',
            props:['name'],
            data(){
                return{
                    price:'$999999999'
                }
            },
            methods:{
                say(){
                    console.log("慌什么")
                }
            }
            
            }
            var vm =new Vue({
                el:'#app',
                data:{
                    name:'Kobe'
                },
                methods:{
                    getEle(){
                        console.log(this.$refs.com.price)
                         console.log(this.$refs.p1.innerText)
                        this.$refs.com.say()
                    }
                },
                components:{
                    vm
                }
            })
        
        
        
        
        
    </script>
        
图片.png

http://www.cnblogs.com/keepfool/p/5625583.html
https://github.com/shy1118999/vue.js

上一篇 下一篇

猜你喜欢

热点阅读