美文网首页Vue
Vue.js学习No.4

Vue.js学习No.4

作者: 仕明同学 | 来源:发表于2019-03-31 23:00 被阅读61次
  • 欢迎关注我的公众号

    公众号
  • 学习的内容如下

  • 开始

  • 父组件向子组件传递值

  • 父组件,可以在引用子组件的时候,通过属性绑定(v-bind:)的 形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件的内部
    <com1 v-bind:parentmsg="msg"></com1>

  • 子组件不能访问到 父组件data中的数据,就是访问不到msg,但是有方法可以访问到

  • 子组件中的data的数据,并不是通过父组件传递的,是自己私有的,

  • 子组件通过Ajax请求回来的数据

  • data里面的数据是可读可写的

  • 把父组件传递过来的属性parentmsg,定义一下,这样才能使用父组件中的数据

   template:"<h1 @click='change'>子组件  ---{{parentmsg}}--</h1>",
  • 把父组件传递过来的属性parentmsg,定义一下,这样才能使用父组件中的数据
  • props里面的数据是只读的,不能够更改的,但是好像现在可以了??,而且程序不报错????
                props:["parentmsg"],
  • 修改了 props里面的数据是只读的,不能够更改的,但是好像现在可以了??


    image.png
  • Demo父组件向子组件传递值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue.min.js"></script>
</head>
<body>

    <div id="app">
         <!-- 父组件,可以在引用子组件的时候,通过属性绑定(v-bind:)的
        形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件的内部 -->
         <com1 v-bind:parentmsg="msg"></com1>

    </div>
    <script>
        //可以把vm当成一个组件
    var vm=new Vue({
        el:"#app",
        data() {
            return {
                 msg:"父组件---我是vue的数据"
            }
        },
        methods: {
            
        },
        components:{
            //子组件不能访问到 父组件data中的数据,就是访问不到msg,但是有方法可以访问到
            com1:{
                //子组件中的data的数据,并不是通过父组件传递的,是自己私有的,
                // 子组件通过Ajax请求回来的数据 
                // data里面的数据是可读可写的
               data() {
                   return {
                       title:"dd"
                   }
               },

                template:"<h1 @click='change'>子组件  ---{{parentmsg}}--</h1>",
                //  把父组件传递过来的属性parentmsg,定义一下,这样才能使用父组件中的数据
                // props里面的数据是只读的,不能够更改的,但是好像现在可以了??
                props:["parentmsg"],
                methods: {
                    change(){
                        this.parentmsg="修改了 props里面的数据是只读的,不能够更改的,但是好像现在可以了??"
                    }
                },
            }
        }
    })
    </script>
</body>
</html>
  • 子组件向父组件传递值

  • 子组件传递给父组件值,其实就是父组件传递一个方法,子组件调用方法,然后把值传递给父组件

  • 事件绑定机制,v-on 把父组件的show的方法传递给子组件的event

  • v-on可以简写为 @符号

        <com2 v-on:event="show"></com2>
  • 通过制定了一个ID,去加载id的template元素中的内容,当做组件的HTML结构
template: "#tmpl", 
  • 如何拿到父组件的方法
 // 如何拿到父组件的方法
                    //emit 愿意就是触发,调用
                    this.$emit("event", this.ddddd)
                    this.$emit("event", "我是子组件传递过来的值哦")
                    this.$emit("event", 123456)

  • 触发父组件的方法


    image.png
image.png
  • 為什麼打印不出來這個對象????? 我已經延遲3s了啊啊啊啊啊,我想打印出来子组件传递给父组件的值,但是代码执行会报错????我开头以为赋值有延迟,还延迟3s去执行,但是还是有问题?
 setTimeout(function () {
                        console.log('执行了');
                        console.log(shimingForSon)
                    }, 3000);
  • Demo子组件向父组件传递值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue.min.js"></script>
</head>
<!--  -->
<!-- 子组件传递给父组件值,其实就是父组件传递一个方法,子组件调用方法,然后把值传递给父组件 -->
<body>

    <div id="app">
        <!-- 事件绑定机制,v-on 把父组件的show的方法传递给子组件的event-->
        <!-- v-on 可以简写为 @符号  -->
        <com2 v-on:event="show"></com2>
    </div>

    <template id="tmpl">

        <div>
            <h2>我是tmpl组件</h2>
            <input type="button" value="点我,可以触发父组件的方法" @click="myDemo">
        </div>
    </template>
    <script>
        //定义了一个字面量类型的组件模板对象 
        var com2 = {
            // 通过制定了一个ID,去加载id的template元素中的内容,当做组件的HTML结构
            template: "#tmpl",
            data() {
                return {
                    // 对象
                    ddddd: { name: "仕明同学", age: "18" }
                }
            },
            methods: {
                myDemo() {
                    console.log("我是子组件")
                    // 如何拿到父组件的方法
                    //emit 愿意就是触发,调用
                    this.$emit("event", this.ddddd)
                    this.$emit("event", "我是子组件传递过来的值哦")
                    this.$emit("event", 123456)

                }
            },
        }

        //可以把vm当成一个组件
        var vm = new Vue({
            el: "#app",
            data() {
                console.log("data我开始执行了")
                return {
                    msg: "父组件---我是vue的数据",
                    shimingForSon: null
                }
            },
            methods: {
                // 这个data可以让子组件传递参数过来
                show(data) {
                    console.log("我是父组件的方法show" + data)
                    console.log(data)
                    this.shimingForSon = data
                    // 為什麼打印不出來這個對象????? 我已經延遲3s了啊啊啊啊啊
                     setTimeout(function () {
                        console.log('执行了');
                        console.log(shimingForSon)
                    }, 3000);
                    // console.log(shimingForSon)


                }
            },
            components: {
                com2
            }

        })
    </script>
</body>

</html>
  • Demo 评论的列表
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue.min.js"></script>
    <!-- 注意是rel 啊 -->
    <link rel="stylesheet" href="./lib/bootstrap.min.css">
</head>

<body>
    <div id="app">
            <!-- loaddata的方法是父组件的传递给子组件  -->
        <box @func="loadData"></box>
        <ul class="list-group">
            <li class="list-group-item" v-for="item in list" :key="item.id">
                <span class="badge">{{item.user}}</span>
                {{item.content}}
            </li>

        </ul>



    </div>

    <template id="tmpl">

        <div>
            <div class="form-group">
                <label>人:</label>
                <textarea class="form-control" v-model="user"></textarea>
            </div>

            <div class="form-group">
                <label>内容:</label>
                <textarea class="form-control" v-model="content"></textarea>
            </div>
            <div class="form-group">
                <input type="button" value="发表" @click="add" class="btn btn-primary">
            </div>
        </div>
    </template>
    <script>
        var commentBox = {
            template: "#tmpl",
            data() {
                return {
                    user: "",
                    content: "",

                }
            },
            methods: {
                add() {
                    console.log("点击组件的")
                    // 数据存放到了 localStorage中去了 
                    // 组织一个最新的评论数据对选哪个
                    // 把对象存储到localStorage中去
                    // 注意 localStorage中支持存放字符串数据,先调用 JSON.stringify
                    // 注意  数据完整性,新加的数据要和旧的数据一起存储  
                    // 注意 如果数据不存在的话,就直接返回一个空的数组
                    // 注意单词千万不要写错了啊
                    var commentqq = {
                        id: Date.now(), user: this.user, content: this.content
                    }
                    // 从本地获取数据
                    var strdata = localStorage.getItem("cmts") || "[]"
                    var list = JSON.parse(strdata)
                    // 注意顺序
                    // list.push(commentqq)
                    // 就是把数据添加到首部 
                    list.unshift(commentqq)

                    //  保存数据到本地

                    localStorage.setItem("cmts", JSON.stringify(list))

                    // 清空数据
                    this.user = this.content = ""
                    console.log("点击组件的 end" + list + this.user)

                    // 点击完了 我需要刷新数据

                    // func  是父组件传递过来的方法  子组件来触发这个方法
                    this.$emit("func")
                }
            },
        }

        var vm = new Vue({
            el: "#app",
            data: {
                list: [
                    { id: Date.now(), user: "shiming", content: "text" },
                    { id: Date.now(), user: "shiming1", content: "text1" },
                    { id: Date.now(), user: "shiming2", content: "text2" }
                ]
            },
            methods: {
                loadData() {
                    var strdata = localStorage.getItem("cmts") || "[]"
                    var list = JSON.parse(strdata)
                    this.list = list
                }
            },
            //初始化好了
            created() {
                this.loadData()
            },
            components: {
                "box": commentBox
            }
        })
    </script>

</body>

</html>
  • ref获取DOM元素和组件的引用
  • 说通俗一点就是可以使用子组建的方法和数据
  • console.log(this.$refs.id_h3.innerText)
    <div  id="app">
         <input type="button" value="获取元素" @click="getElement" ref="btn">

<!-- ref 可以指定 原生的DOM对象 -->
         <h3 id="id_h3"  ref="id_h3">你好啊</h3>
    </div>
    
image.png
  • Demo
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <script src="./lib/vue.min.js"></script>
</head>

<body>

    <div id="app">
        <input type="button" value="获取元素" @click="getElement" ref="btn">

        <!-- ref 可以指定 原生的DOM对象 -->
        <h3 id="id_h3" ref="id_h3">你好啊</h3>
        <hr>
        <!-- 组件也可以使用 -->
         <login ref="myLogin"></login>
        
    </div>
 

    <template id="login">
        <h1>登陆</h1>
    </template>
    <script>

        var login = {
            template: "#login",
            data() {
                return {
                    msg:"我是组件"
                }
            },    
            methods: {
                show(){
                    console.log("调用了子组件的方法")
                }
            },
        }
        var vm = new Vue({
            el: "#app",

            data: {

            },

            methods: {
                getElement() {
                    // 通过id获取DOM元素 ,但是Vue不推荐
                    // <h3 id="id_h3">你好啊</h3>
                    console.log(document.getElementById("id_h3"))


                    console.log("我是Vue中获取DOM元素的对象的方法")
                    //  输出你好  我擦 牛逼
                    // ref 是 reference 
                    console.log(this.$refs.id_h3.innerText)

                    // 获取子组件中的 data
                    console.log(this.$refs.myLogin.msg)

                    // 调用子组件的方法
                    this.$refs.myLogin.show()

                }
            },

            components:{
               "login":login
              
            }
        })
    </script>
</body>

</html>

路由

  • 后端的路由:所有的URL地址对应都是服务器上对应的资源
  • 前端路由:对于单页面的应用程序来说,主要是通过 URLhash (#)号来实现不同页面之间的切换,同时hash有一个特点,http的请求不会包含ash相关的内容,所以单页面的程序主要是通过hash实现
  • 使用路由的方法
  • 1、导入包
 <!-- vue -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- vue路由 -->
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

  • 2、定义组件
  var login = {
            template: "<h1>我是登陆组件</h1>"
        }
        var register = {
            template: "<h1>我是注册组件</h1>"
        }
  • 3、定义对象 注意routes的拼写,没有r
      const router = new VueRouter({
            // 表示路由匹配的规则  
            routes: [

                // path 表示监听那个路由连接的地址
                // component 百世路由前面匹配到的path,展示相对的应的那个组件
                // component 必须是一个组件的模板对象,不能是组件应用的名称

                //  指定默认的为登陆,但是不推荐啊 
                //  {path:"/",component:login},
                // redirect进入页面的时候,直接就去login组件的页面
                { path: "/", redirect: "/login" },
                { path: "/login", component: login },

                { path: "/register", component: register }

            ],
            // 默认值: "router-link-active"

            // 设置 链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
        //    改成自己的想要的样式
            linkActiveClass:"myStyle"

        })
  • 4、注册到vm中去
      // 将路由规则对象,注册到vm实例上,用来监听URL对象的地址的变化。然后展示相对应的组件
            router: router
  • 注意事项

  • redirect进入页面的时候,直接就去login组件的页面 { path: "/", redirect: "/login" },

  • "router-link-active" 设置 链接激活时使用的CSS类名。默认值可以通过路由的构造选项linkActiveClass 来全局配置。 改成自己的想要的样式
    linkActiveClass:"myStyle"

  • path 表示监听那个路由连接的地址

  • component 必须是一个组件的模板对象,不能是组件应用的名称

  • 路由传递参数方式一

  • 使用k to="/login?id=10&name=shiming" 传递参数,

  <!-- router-link 默认渲染为a标签  tag指定渲染成什么标签-->
        <!-- 如果在路由中,使用查询字符串,给路由传递参数,则不需要修改路由规则的path属性 -->
        <router-link to="/login?id=10&name=shiming" tag="span">登陆</router-link>
   
  • 在组件中的created方法中获取参数
   // 组件的生命周期
            created() {
                console.log("我是登陆组件的日志")
                console.log(this.$route)
                console.log(this.$route.query.id)
            },
  • 获取值为


    image.png
  • 然后显示在控件上
     // 通过这种的方式可以拿到路径中的值
        var login = {
            template: "<h1>我是登陆组件  {{$route.query.id }}----{{$route.query.name}}</h1>",
            // 组件的生命周期
            created() {
                console.log("我是登陆组件的日志")
                console.log(this.$route)
                console.log(this.$route.query.id)
            },
        }
  • router-link-active 其中的值的意思:
   /* 实现路由的文字的颜色 */
        .router-link-active {
            color: red;
            font-weight: 800;
            /* 倾斜 */
            font-style: italic;
            /* 大小 */
            font-size: 100px;
            /* 下划线 */
            text-decoration: underline;
            /* 背景色 */
            background-color: goldenrod
        }
  • 完整的Demo
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- vue -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- vue路由 -->
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <style>
        /* 实现路由的文字的颜色 */
        .router-link-active {
            color: red;
            font-weight: 800;
            /* 倾斜 */
            font-style: italic;
            /* 大小 */
            font-size: 100px;
            /* 下划线 */
            text-decoration: underline;
            /* 背景色 */
            background-color: goldenrod
        }

        .myStyle {
            color: hotpink;
        }

        .v-enter,
        .v-leaver-to {
            opacity: 0;
            transform: translateX(100px);

        }

        .v-enter-active,
        .v-leaver-active {
            transition: all 0.5s ease;
        }
    </style>
</head>

<body>

    <div id="app">
        <!--不推荐这样使用 -->
        <!-- <a href="#/login">登陆</a>
        <a href="#/register">注册</a> -->

        <!-- router-link 默认渲染为a标签  tag指定渲染成什么标签-->
        <!-- 如果在路由中,使用查询字符串,给路由传递参数,则不需要修改路由规则的path属性 -->
        <router-link to="/login?id=10&name=shiming" tag="span">登陆</router-link>
        <router-link to="/register">注册</router-link>
        <!-- 这是 vue-router中提供的元素,专门用来站位使用 -->
        <!-- 包裹动画  mode="out-in"动画的加载的方式-->
        <transition mode="out-in">
            <router-view></router-view>
        </transition>



    </div>

    <script>
        // 通过这种的方式可以拿到路径中的值
        var login = {
            template: "<h1>我是登陆组件  {{$route.query.id }}----{{$route.query.name}}</h1>",
            // 组件的生命周期
            created() {
                console.log("我是登陆组件的日志")
                console.log(this.$route)
                console.log(this.$route.query.id)
            },
        }
        var register = {
            template: "<h1>我是注册组件</h1>"
        }
        const router = new VueRouter({
            // 表示路由匹配的规则  
            routes: [

                // path 表示监听那个路由连接的地址
                // component 百世路由前面匹配到的path,展示相对的应的那个组件
                // component 必须是一个组件的模板对象,不能是组件应用的名称

                //  指定默认的为登陆,但是不推荐啊 
                //  {path:"/",component:login},
                // redirect进入页面的时候,直接就去login组件的页面
                { path: "/", redirect: "/login" },
                { path: "/login", component: login },

                { path: "/register", component: register }

            ],
            // 默认值: "router-link-active"

            // 设置 链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
            //    改成自己的想要的样式
            linkActiveClass: "myStyle"

        })


        var vm = new Vue({
            el: "#app",

            data: {

            },

            methods: {

            },
            // 将路由规则对象,注册到vm实例上,用来监听URL对象的地址的变化。然后展示相对应的组件
            //    如果属性名一样的话,可以直接写 router
            // router: router
            router
        })
    </script>
</body>

</html>
  • 路由传递参数方式二
  • 1、传入参数
  <!-- router-link 默认渲染为a标签  tag指定渲染成什么标签-->
        <router-link to="/login/10/lishiming" tag="span">登陆</router-link>
  • 2、router定义{ path: "/login/:id/:name", component: login },
    const router = new VueRouter({
            // 表示路由匹配的规则  
            routes: [

                // path 表示监听那个路由连接的地址
                // component 百世路由前面匹配到的path,展示相对的应的那个组件
                // component 必须是一个组件的模板对象,不能是组件应用的名称

                //  指定默认的为登陆,但是不推荐啊 
                //  {path:"/",component:login},
                // redirect进入页面的时候,直接就去login组件的页面
                { path: "/", redirect: "/login" },
                // 第二种传递参数的方法 
                { path: "/login/:id/:name", component: login },

                { path: "/register", component: register }

            ],
            // 默认值: "router-link-active"

            // 设置 链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
            //    改成自己的想要的样式
            linkActiveClass: "myStyle"

        })
  • 3、 router如果属性名一样的话,可以直接写
  // 将路由规则对象,注册到vm实例上,用来监听URL对象的地址的变化。然后展示相对应的组件
            //    如果属性名一样的话,可以直接写 router
            // router: router
            router
  • Demo
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- vue -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- vue路由 -->
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <style>
        /* 实现路由的文字的颜色 */
        .router-link-active {
            color: red;
            font-weight: 800;
            /* 倾斜 */
            font-style: italic;
            /* 大小 */
            font-size: 100px;
            /* 下划线 */
            text-decoration: underline;
            /* 背景色 */
            background-color: goldenrod
        }

        .myStyle {
            color: hotpink;
        }

        .v-enter,
        .v-leaver-to {
            opacity: 0;
            transform: translateX(100px);

        }

        .v-enter-active,
        .v-leaver-active {
            transition: all 0.5s ease;
        }
    </style>
</head>

<body>

    <div id="app">
        <!--不推荐这样使用 -->
        <!-- <a href="#/login">登陆</a>
        <a href="#/register">注册</a> -->

        <!-- router-link 默认渲染为a标签  tag指定渲染成什么标签-->
        <router-link to="/login/10/lishiming" tag="span">登陆</router-link>
        <router-link to="/register">注册</router-link>
        <!-- 这是 vue-router中提供的元素,专门用来站位使用 -->
        <!-- 包裹动画  mode="out-in"动画的加载的方式-->
        <transition mode="out-in">
            <router-view></router-view>
        </transition>



    </div>

    <script>
        // 通过这种的方式可以拿到路径中的值
        var login = {
            template: "<h1>我是登陆组件  {{$route.params.id}}----{{$route.params.name}}</h1>",
            // 组件的生命周期
            created() {
                console.log("我是登陆组件的日志")
                console.log(this.$route.params.id)
            
            },
        }
        var register = {
            template: "<h1>我是注册组件</h1>"
        }
        const router = new VueRouter({
            // 表示路由匹配的规则  
            routes: [

                // path 表示监听那个路由连接的地址
                // component 百世路由前面匹配到的path,展示相对的应的那个组件
                // component 必须是一个组件的模板对象,不能是组件应用的名称

                //  指定默认的为登陆,但是不推荐啊 
                //  {path:"/",component:login},
                // redirect进入页面的时候,直接就去login组件的页面
                { path: "/", redirect: "/login" },
                // 第二种传递参数的方法 
                { path: "/login/:id/:name", component: login },

                { path: "/register", component: register }

            ],
            // 默认值: "router-link-active"

            // 设置 链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
            //    改成自己的想要的样式
            linkActiveClass: "myStyle"

        })


        var vm = new Vue({
            el: "#app",

            data: {

            },

            methods: {

            },
            // 将路由规则对象,注册到vm实例上,用来监听URL对象的地址的变化。然后展示相对应的组件
            //    如果属性名一样的话,可以直接写 router
            // router: router
            router
        })
    </script>
</body>

</html>
  • 路由的嵌套
  • 使用children的属性 实现路由的嵌套
  • 使用children属性,实现子路由,同时,子路由的path前面不要带 / ,如果带了,就永远以根路径开始请求,这样不方便我们用户去理解URL地址
  • <router-view></router-view>如果使用需要了使用就必须使用占位符
  • Demo
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- vue -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- vue路由 -->
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

</head>

<body>

    <div id="app">
        <!-- 这种方式也是可以引用组件的哦 -->
        <!-- <shiming></shiming> -->
        <router-link to="/acount">Acount</router-link>
        <router-view></router-view>

    </div>


    <template id="tmpl">

        <div>
            <h1>这是 Account组件 里面还嵌套了一个路由</h1>
            <!-- 路由的嵌套 -->
            <router-link to="/acount/login"> 登陆</router-link>

            <router-link to="/acount/register">注册</router-link>
            <!-- 占位符 必须要 -->
            <router-view></router-view>
        </div>
    </template>
    <script>

        var account = {
            template: "#tmpl"
        }
        var login = {
            template: "<h3>登陆</h3>"
        }
        var register = {
            template: "<h3>组成</h3>"
        }
        const router = new VueRouter({
            //  这里的不能写成 routers 哦
            routes: [
                {
                    path: "/acount",
                    component: account,
                    // 使用children的属性 实现路由的嵌套 
                    // 记住 ,login前面不能加上 / 
                    // 虽然还有另外的方式,但是呢?建议这样使用,然后方便去理解
                    // 使用children属性,实现子路由,同时,子路由的paht前面不要带 / ,如果带了,就永远以根路径开始请求,这样不方便我们用户去理解URL地址
                    children: [
                        { path: "login", component: login },
                        { path: "register", component: register }
                    ]
                },
                // // 
                //  { path: "/acount/login", component: login },

                //  { path: "/acount/register", component: register }
            ]
        })
        var vm = new Vue({
            el: "#app",

            data: {

            },

            methods: {

            },
            components: {
                "shiming": account
            },
            router
        })
    </script>
</body>

</html>
  • 经典布局
  • components 对应很多的组件
  • <router-view></router-view>三个坑
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- vue -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- vue路由 -->
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <style>
        /* 设置html页面中的 body边距  */
        html,body{
            margin: 0;
            padding: 0;
        }
        .container {
            display: flex;
        }
        /* h1 标签没有逗号哦 记住哦 */
        h1{
            margin: 0;
            padding: 0;
            font-size: 20px;
        }
        .header {
            background-color: aqua;
            height: 100px;
        }

        .left {
            background-color: yellow;
            flex: 2;
            height: 600px;
        }

        .main {
            background-color: blueviolet;
            flex: 10;
            height: 600px;
        }
    </style>
</head>

<body>

    <div id="app">

        <!-- 3个坑 -->
        <router-view></router-view>
        <div class="container">

            <router-view name="left"></router-view>

            <router-view name="main"></router-view>
        </div>

    </div>

    <script>

        var header = {
            template: "<h1 class='header'>Header 头部</h1>"
        }
        var leftBox = {
            template: "<h1 class='left'>left 侧边栏</h1>"
        }
        var mainBox = {
            template: "<h1 class='main'>mainBox 主体区域</h1>"
        }

        const router = new VueRouter({
            routes: [
                // 这种方法不能实现 
                // {path:"/",component:header},
                // {path:"/left",component:left},
                // {path:"/mainBox",component:mainBox},
                //  components 对应很多的组件
                {
                    path: "/", components: {
                        "default": header,
                        "left": leftBox,
                        "main": mainBox
                    }
                }
            ]
        })

        var vm = new Vue({
            el: "#app",

            data: {

            },

            methods: {

            },
            // router名字一样 可以简写哦
            router
        })
    </script>
</body>

</html>
  • 以上,待续

相关文章

网友评论

    本文标题:Vue.js学习No.4

    本文链接:https://www.haomeiwen.com/subject/dsgpvqtx.html