前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >测试开发进阶(十九)

测试开发进阶(十九)

作者头像
zx钟
发布2019-09-24 16:00:40
3540
发布2019-09-24 16:00:40
举报
文章被收录于专栏:测试游记

嵌套路由

场景:父页面打开,再打开子页面

借鉴官方示例:

https://github.com/vuejs/vue-router/blob/dev/examples/nested-routes/app.js

代码语言:javascript
复制
const router = new VueRouter({
    mode: 'history',
    base: __dirname,
    routes: [
        {path: '/', redirect: '/parent'},
        {
            path: '/parent',
            component: Parent,
            children: [
                // an empty path will be treated as the default, e.g.
                // components rendered at /parent: Root -> Parent -> Default
                {path: '', component: Default},
                // components rendered at /parent/foo: Root -> Parent -> Foo
                {path: 'foo', component: Foo},
                // components rendered at /parent/bar: Root -> Parent -> Bar
                {path: 'bar', component: Bar},
                // NOTE absolute path here!
                // this allows you to leverage the component nesting without being
                // limited to the nested URL.
                // components rendered at /baz: Root -> Parent -> Baz
                {path: '/baz', component: Baz},
                {
                    path: 'qux/:quxId',
                    component: Qux,
                    children: [
                        {path: 'quux', name: 'quux', component: Quux},
                        {path: 'quuy', name: 'quuy', component: Quuy}
                    ]
                },
                {path: 'quy/:quyId', component: Quy},
                {name: 'zap', path: 'zap/:zapId?', component: Zap}
            ]
        }
    ]
})

修改 /src/router/index.js

代码语言:javascript
复制
{
    path: '/login',
    component: Login,
    children: [
        {path: '', component: Login},//默认路由
        {path: '/projects_list2', component: ProjectsList},
        {path: 'projects_list2', component: ProjectsList}
    ]
},

/src/components/Login.vuetemplate中添加以下内容

代码语言:javascript
复制
<p>=====================</p>
<router-view></router-view>

输入:http://localhost:8080/login会显示两个输入内容

这是因为子路由中有一个 的默认路由:{path:'',component:Login},所以父路由加载一次,子路由加载一次

输入: http://localhost:8080/projects_list2会显示登录部分和项目部分

但是它使用的是 {path:'/projects_list2',component:ProjectsList}

输入: http://localhost:8080/login/projects_list2也会显示一样的内容

但它使用的是 {path:'projects_list2',component:ProjectsList}

两者区别是有无 /

axios

  • 非常流行的请求库
  • vue发起异步请求的标配

安装方式:

代码语言:javascript
复制
$ cnpm install axios -S

测试接口:https://dog.ceo/api/breeds/image/random

修改 /src/components/HelloWorld.vue

代码语言:javascript
复制
<script>
    import axios from 'axios'

    export default {
        name: 'HelloWorld',
        props: { //从父组件获取msg
            msg: String,
            title: Number,
        },
        mounted() {
            axios.get('https://dog.ceo/api/breeds/image/random')
                .then(function (response) {
                    console.log(response);
                    console.log(response.data);
                })
                .catch(function (err) {
                    console.log(err);
                })
        }
    }
</script>

/src/components/HelloWorld.vue

代码语言:javascript
复制
<template>
    <div class="hello">
        <h1>{{ msg }}</h1>
        <h2>{{ title }}</h2>
        <el-image :src="url" fit="cover"></el-image>
    </div>
</template>

<script>
    import axios from 'axios'
    export default {
        name: 'HelloWorld',
        props: { //从父组件获取msg
            msg: String,
            title: Number,
        },
        data() {
            return {
                url: '',
            }
        },
        mounted() {
            axios.get('https://dog.ceo/api/breeds/image/random')
                .then(response => {
                    console.log(response);
                    console.log(response.data);
                    this.url = response.data.message;
                })
                .catch(function (err) {
                    console.log(err);
                });
        }
    }
</script>

<style scoped>
    h3 {
        margin: 40px 0 0;
    }
    ul {
        list-style-type: none;
        padding: 0;
    }
    li {
        display: inline-block;
        margin: 0 10px;
    }
    a {
        color: #42b983;
    }
</style>

代码封装

新建 /src/api/api.js

代码语言:javascript
复制
import axios from 'axios'


var host = 'https://dog.ceo';

export const dogs = () => {
    return axios.get(`${host}/api/breeds/image/random`)
};

修改 HelloWorld.vue

代码语言:javascript
复制
import {dogs} from '../api/api.js'


mounted() {
            dogs()
                .then(response => {
                    console.log(response);
                    console.log(response.data);
                    this.url = response.data.message;
                })
                .catch(function (err) {
                    console.log(err);
                });
        }

slot插槽

默认情况下,在子组件开始标签和结束标签中间添加的内容会忽略

/src/components/greeting.vuetemplate中增加以下内容

代码语言:javascript
复制
<hello-world>
    <p>这是Hello-world子组件</p>
</hello-world>

如果需要展示出来需要在 /src/components/HelloWorld.vue中添加:

<slot></slot>也就是插槽

如果在 slot中写入内容,那外部不使用会使用默认的:

<slot><p>喵喵喵</p></slot>

代码语言:javascript
复制
# greeting.vue
<hello-world></hello-world>

# HelloWorld.vue
<slot><p>喵喵喵</p></slot>
代码语言:javascript
复制
# greeting.vue
<p>这是Hello-world子组件</p>

# HelloWorld.vue
<slot><p>喵喵喵</p></slot>

命名插槽

代码语言:javascript
复制
# greeting.vue
<hello-world>
    <!--vue2.6之前-->
    <p slot="part1">这是Hello-world子组件</p>
    <!--vue2.6之后-->
    <!--v-slot="part2" 可以缩写为 #part2-->
    <template v-slot="part2">
    <template #part2> 
        <p>这是part2</p>
    </template>
</hello-world>

# HelloWorld.vue
<slot name="part1"><p>汪汪汪</p></slot>
<slot name="part2"><p>咳咳咳</p></slot>

插槽作用域

代码语言:javascript
复制
# greeting.vue
<hello-world>
    <!--vue2.6之前-->
    <p slot="part4" slot-scope="sope">
        {{sope.user}}:这是Hello-world子组件
    </p>
    <!--vue2.6之后-->
    <template #part4="sope">
    <p>{{sope.user}}:这是part4</p>
    </template>
    <!--简写-->
    <template #part4="{user}">
        <p>{{user}}:这是part4</p>
    </template>
</hello-world>

# HelloWorld.vu
<slot name="part4" :user="username"></slot>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 嵌套路由
  • axios
    • 代码封装
    • slot插槽
      • 命名插槽
        • 插槽作用域
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档