欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue笔记(3)

程序员文章站 2022-03-29 14:49:58
...

父子组件,默认情况下父子组件之间数据不能直接使用,所以有一些新的方法、

1、子组件获取父组件数据
—父组件调用子组件时<bb :m="msg" :y="msg2"></>//msg/msg2为父组件数据
—子组件内部声明
—–1、props:[‘m’,’y’]
—–2.props:{
—-‘m‘:String//数据类型,如果从父级获取的数据不是该类型会报错
—-’y‘:Number
}

 <script src="./bower_components/vue/dist/vue.js"></script>
</head>
<body>
    <div class="box">
        <my-aa></my-aa>
    </div>
    <!-- <script type="x-template" id="aa">  声明组件的方式,
        <h2>{{msg}}</h2>
    </script> -->
    <template id="aa">
        <h2>{{msg+1}}</h2>
        <bb :m="msg"></bb> 
    </template>
    <template id="bb">
        {{m}}---------{{aaa}}
    </template>
    <script>
        new Vue({
            el:".box",
            data:{
                msg:11111111
            },
            components:{
                "my-aa":{
                    data(){
                        return {
                            msg:22222222222
                        }
                    },
                    template:"#aa",
                    components:{
                        "bb":{
                            data(){
                                return {
                                    aaa:111
                                }
                            },
                            props:['m'],
                            template:"#bb"
                        }
                    }
                }
            }
        })

    </script>

父组件获取子组件的数据
—-子组件把数据发送到父级
—-子组件中写入 `vm.$emit(事件名,数据)
—-父组件中定义获取数据的方法//getMsg(msg)

<template>
    <bb @事件名($emit发送的事件名)=“方法名(父组件)”></>
</>
//实例
 <script src="./vue-1.0.28.js"></script>
</head>

<body>
    <div id="box">
        付组件的数据==》{{mag}}<br>
        <aaa>这里也不能显示呢,不要往这里写东西</aaa>
    </div>
    <template id="aa">
        <h1>{{msg}}</h1>
        <bbb @childmsg="getMsg"></bbb>
    </template>
    <template id="bb">
        <h2>我是bbb的数据----{{msg2}}</h2>
        <input type="button" @click="toPar" value="submit">
    </template>
    <script>
        new Vue({
            el: "#box",
            data: {
                mag: "我是父组件的数据"
            },
            components:{
                "aaa":{
                    data(){
                        return {
                            msg:11111111111
                        }
                    },
                    methods:{
                        getMsg(msg){
                            // alert(msg)
                            this.msg+=msg;
                        }
                    }
                    ,
                    template:"#aa",
                    components:{
                        "bbb":{
                            data(){
                                return {
                                    msg2:22222222222
                                }
                            },
                            template:"#bb",
                            methods:{
                                toPar(){
                                    this.$emit("childmsg",this.msg2)
                                }
                            }
                        }
                    }
                }
            }
        })
    </script>

====================
2.0后淘汰的方法
vm.$dispatch(事件名,数据)
vm.$broadcast(事件名,数据)
这两个需要配合event

占位符

<aa>当这里有文字时模板中需要使用slot</aa>
<template id="aa">
    <h1>调用aa标签时,标签中的内容为模板中slot的位置</>    
    <slot>如果aa标签中没有内容,则显示这里的内容</>
</>

2/ <template>中设置slot的位置,之后用name进行关联<slot name="aaa"></>
html中设置<ul slot="aaa"></>//这样,占位符就能与标签相对应

实例:

 <script src="./bower_components/vue/dist/vue.js"></script>
</head>
<body>
    <div class="box">
        <div>
            {{msg}}
        </div>
        <new-a>
            <ol slot="newa2">
                <li>3</li>
                <li>6</li>
            </ol>
            <ul slot="newa">
                <li>1</li>
                <li>2</li>
                <li>3</li>
            </ul>
        </new-a>
    </div>
    <template id="aa">
        <h1>{{msgA}}</h1>
        <slot name="newa">我是slot</slot>
        <new-b>
            <ol slot="newb">
                <li>3</li>
                <li>4</li>
            </ol>
        </new-b>
        <slot name="newa2"></slot>
    </template>
    <template id="bb">
        <slot name="newb"></slot>
        <h2>{{msgB}}</h2>
    </template>
    <script>

        new Vue({
            el:".box",
            data:{
                msg:'我是根组件'
            },
            components:{
                'newA':{
                    data(){
                        return {
                            msgA:"我是组件A"
                        }
                    },
                    template:"#aa",
                    components:{
                        'newB':{
                            data(){
                                return {
                                    msgB:'我是组件b'
                                }
                            },
                            template:'#bb',
                        }
                    }
                }
            }
        })
    </script>

路由 vue-router
下载 bower install vue-router#0.7.13
html部分写法 <a v-link="{path:'/home'}">主页</a>
展示内容 <router-view></router-view>

<script>
    //1. 准备根文件
    var app = Vue.extend();
    //2.写入各个页面的组件(如home/news 我的实例)
    var Home = Vue.extend({//Home是模板名
        template:'<h1>我是主页';
    });
    //3.准备路由
    var router = new VueRouter();
    //4.关联
    router.map({
        'home':{
            component:Home
        }
    })
    //5.启动路由
    router.start(app,"#box")

    //指定首页路由,打开网站后直接跳到的路由
    router.redirect({
        '/':'home'
    })
</>

//实例
<script src="./bower_components/vue/dist/vue.js"></script>
    <script src="./bower_components/vue-router/dist/vue-router.js"></script>
</head>
<body>
    <div id="box">
        <a v-link="{path:'/home'}">主页</a>
        <a v-link="{path:'/other'}">other</a>
        <router-view></router-view>
    </div>
    <script>    
        var app = Vue.extend();
        var router = new VueRouter();
        var home = Vue.extend({
            template:"<h1>i'm home"
        })
        var other = Vue.extend({
            template:"<h2>i'm other"
        })
        router.map({
            'home':{
                component:home
            },
            'other':{
                component:other
            }
        })
        router.start(app,"#box")

        //页面刚出来直接跳转指定页面
        router.redirect({
            '/':'home'
        })
    </script>

多级路由

router.map(
    'home':{
        component:Home,
        subRoutes:{
            'login':{
                component:{
                    template:'#aa'
                }
            }
        }
    }
)
html写法
<a v-link="{path:'/home/login'}">login</>
<router-view></>.

路由设计的其他信息
/details/:id/age/:age
{{$route.params |jsom}}  ->    获取传递的参数 ->{id:'',age:'' }

{{$route.path}}        -> 当前的路径            —>/details/001?a=2&b=1

{{$route.query |json}} ->  数据(get方式传递过来的)—>{a:1,b:2}
//实例

 <script src="./bower_components/vue/dist/vue.js"></script>
    <script src="./bower_components/vue-router/dist/vue-router.js"></script>
</head>
<body>
    <div id="box">
        <h1>路由练习</h1>
        <div>
            <a v-link="{path:'/home'}">home</a>
            <a v-link="{path:'/news'}">news</a>
        </div>
        <div>
            <router-view></router-view>
        </div>
    </div>
    <template id="home">
        <h1>我是home页 ---{{msg}}</h1>
        <div>
            <a v-link="{path:'/home/login'}">login</a>
            <a v-link="{path:'/home/regist'}">regist</a>
        </div>
        <div>
            <router-view @aaa="get"></router-view>
        </div>
    </template>
    <template id="news">
        <h1>我是news页</h1>
        <a v-link="{path:'/news/details/001'}">我是新闻1</a>
        <a v-link="{path:'/news/details/002'}">我是新闻12</a>
        <hr>
        <router-view></router-view>
    </template>
    <template id="reg">
        <h3 @click='send'>{{aa}}</h3>
    </template>
    <template id="details">
        {{$route.path}}
        <hr>
        {{$route.params | json}}
        <hr>
        {{$route.query | json}}
    </template>
    <script>
        var router = new VueRouter();
        var app = Vue.extend();

        var Home = Vue.extend({
                template:"#home",
                data(){
                    return {
                        msg:"woshi home"
                    }
                },
                methods:{
                    get(data){
                        // alert(data)
                        this.msg+=data;
                    }
                }
        })
        var News = Vue.extend({
                template:"#news"
        })
        var details = Vue.extend({
            template:"#details"
        })

        router.map({
            '/home':{
                component:Home,
                subRoutes:{
                    'login':{
                        component:{
                            template:"<h2>我是login</h2>",
                        }
                    },
                    'regist':{
                        component:{
                            template:"#reg",
                            data(){
                                return {
                                    aa:"woshiREG"
                                }
                            },
                            methods:{
                                send(){
                                    // alert(this.aa)
                                    this.$emit('aaa',this.aa)
                                }
                            }
                        },

                    }
                }
            },
            '/news':{
                component:News,
                subRoutes:{
                    'details/:id':{
                        component:details
                    }
                }
            }
        })

        router.start(app,"#box")

        router.redirect({'/':'home'})
    </script>
相关标签: vue