Vue 路由 props

在Vue项目中,使用路由props传递数据时遇到一个问题:当【模板包含router-view标签的组件】视图更新时,props函数会被多次触发。经过分析,这似乎是Vue的正常行为。为解决这个问题,建议将可能导致视图更新的数据操作移至子组件中,从而避免不必要的props调用。

项目场景:

Vue 路由配置:使用props属性配置数据,传递给路由组件

问题描述:

props属性是一函数,每次【模板包含router-view标签的组件】视图更新,也会触发props;而不只是路由改变,触发props

原因分析:

编写demo,发现依旧存在该问题,怀疑是本身特性

解决方案:

在【模板包含router-view标签的组件】上不做任何导致视图更新的数据变化,将会导致视图更新的部分移到一个子组件中

<!DOCTYPE html>
<html lang="en">

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

<body>
	<!-- 该模板包含<router-view></router-view>,视图更新,将触发路由配置属性props -->
    <div id="app">
        <aoo></aoo>
        <!-- 路由出口 -->
        <!-- 路由匹配到的组件将渲染在这里 -->
        <router-view></router-view>
    </div>
    <script src="assets/vue.js"></script>
    <script src="assets/vue-router.js"></script>
    <script>
        // 1. 定义 (路由) 组件。
        const Foo = {
            template: '<div>foo{{id}}</div>',
            props: ['id'],
            mounted: function () {
                console.log(this.id)
            }
        }

        // 2. 定义路由
        const routes = [{
            path: '/foo/:id',
            component: Foo,
            beforeEnter: (to, from, next) => {
                console.log(to, from);
                next();
            },
            props: function (route) {
                console.log(222)
                return {
                    id: route.params.id
                };
            }
        }]

        // 3. 创建 router 实例,然后传 `routes` 配置
        const router = new VueRouter({
            routes // (缩写) 相当于 routes: routes
        })

        // 4. 创建和挂载根实例
        const app = new Vue({
            router,
            components: { // 将<h1>Hello App!{{title}}</h1>放到一个子组件中
                Aoo: {
                    template: '<h1>Hello App!{{title}}</h1>',
                    data: function () {
                        return {
                            title: ''
                        }
                    },
                    mounted: function () {
                        setTimeout(() => {
                            this.title = "test";
                        }, 2000);
                    }
                }
            }
        }).$mount('#app')
    </script>
</body>

</html>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值