路由-标签切换格式2

(主文件)

<!DOCTYPE html>

<html ng-app="BShop">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <link href="lib/ionic/css/ionic.css" rel="stylesheet"/>
    <script type="text/javascript" src="lib/ionic/js/ionic.bundle.js"></script>
    <link href="css/main.css" rel="stylesheet"/>
    <title>书店</title>
    <script type="text/javascript">
        var BShop = angular.module("BShop", ["ionic"]);
        BShop.config(function ($stateProvider, $urlRouterProvider) {
            $stateProvider.state("home", {
                url: "/home",
                views: {
                    "view-home": {
                        templateUrl: "views/home/home.html",
                        controller: "HomeCtrl"
                    }
                }
            }).state("cart", {
                url: "/cart",
                views: {
                    "view-cart": {
                        templateUrl: "views/cart/cart.html",
                    }
                }
            }).state("mine", {
                url: "/mine",
                views: {
                    "view-mine": {
                        templateUrl: "views/mine/mine.html",
                    }
                }
            });

            $urlRouterProvider.otherwise("home");
        });

        BShop.controller("HomeCtrl", function ($scope, $ionicSideMenuDelegate) {
            $scope.toggleLeft = function () {
                $ionicSideMenuDelegate.toggleLeft();
            }
        });
    </script>
</head>
<body>
<ion-nav-bar></ion-nav-bar>

<ion-side-menus>

    <ion-pane ion-side-menu-content>
        <ion-nav-bar class="bar-stable nav-title-slide-ios"></ion-nav-bar>
        <ion-nav-view animation="slide-left-right">

            <ion-nav-view name="view-home"></ion-nav-view>

        </ion-nav-view>
    </ion-pane>

    <ion-side-menu side="left" class="mine">

        <header class="bar bar-header bar-stable">
            <h1 class="title">个人中心</h1>
        </header>

        <ion-content class="has-header">
            <div class="avatar">
                <img src="img/mine_avatar.jpg" width="80px" height="80px"/>

                <p>姓名</p>
            </div>

            <div class="list">
                <a class="item item-icon-left item-icon-right">
                    <i class="icon ion-clipboard"></i>
                    我的订单
                    <i class="icon ion-ios-arrow-right"></i>
                </a>

                <a class="item item-icon-left item-icon-right">
                    <i class="icon ion-star"></i>
                    我的收藏
                    <i class="icon ion-ios-arrow-right"></i>
                </a>

                <a class="item item-icon-left item-icon-right">
                    <i class="icon ion-gear-a"></i>
                    设置
                    <i class="icon ion-ios-arrow-right"></i>
                </a>
            </div>
        </ion-content>

    </ion-side-menu>
</ion-side-menus>

<ion-tabs class="tabs-positive tabs-icon-top">
    <ion-tab title="首页" icon-on="ion-ios-filing" icon-off="ion-ios-filing-outline" ui-sref="home">
    </ion-tab>

    <ion-tab title="购物车" icon-on="ion-ios-cart" icon-off="ion-ios-cart-outline" ui-sref="cart">
        <ion-nav-view name="view-cart"></ion-nav-view>
    </ion-tab>

    <ion-tab title="我的" icon-on="ion-ios-person" icon-off="ion-ios-person-outline" ui-sref="mine">
        <ion-nav-view name="view-mine"></ion-nav-view>
    </ion-tab>
</ion-tabs>
</body>

</html>

(独立分页)

<ion-view title="购物车" class="cart">
    <ion-content>
    </ion-content>
</ion-view>

### 关于 `el-select-v2` 在路由切换时的行为分析 #### 组件状态保留问题 当使用 `el-select-v2` 并在路由切换过程中遇到状态丢失或不一致的情况时,这通常是因为 Vue 的组件销毁机制所致。每当路由发生变化时,默认情况下 Vue 会卸载当前的组件并重新加载新的组件实例。如果目标组件未被缓存,则其内部状态会被重置[^1]。 为了实现路由切换时的状态保留,可以利用 `<keep-alive>` 标签来缓存特定的组件实例。通过这种方式,即使用户离开该页面再返回,之前的选择项和其他交互数据仍然能够保持不变。 ```html <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view> ``` 上述代码片段展示了如何结合路由元信息 (`meta`) 来控制哪些视图应该被缓存。只有设置了 `meta.keepAlive=true` 的路由才会进入 `<keep-alive>` 缓存范围[^4]。 #### 初始化行为调整 对于某些场景下希望手动初始化而非依赖默认值的情形,可以在生命周期钩子函数中执行自定义逻辑。例如,在 `mounted()` 或者 `activated()` 中设置初始选项列表: ```javascript export default { data() { return { selectedValue: null, optionsList: [] }; }, activated() { this.fetchOptions(); // 当组件激活时拉取最新数据源 }, methods: { fetchOptions() { setTimeout(() => { this.optionsList = [ { value: 'option1', label: 'Option One' }, { value: 'option2', label: 'Option Two' } ]; }, 1000); } } }; ``` 这里需要注意的是,由于 `el-select-v2` 是基于虚拟滚动技术优化的大规模选择器,因此动态更新选项数组可能触发性能瓶颈。务必谨慎处理异步请求与 DOM 更新之间的关系[^3]。 #### 解决属性突变警告 假如发现存在类似于 `"Unexpected mutation"` 这样的错误提示,那可能是父级传递给子组件的数据结构发生了非法更改操作。按照单向数据流原则,prop 不应直接修改而是借助事件回调通知上级改变原始变量副本后再同步下来。 以下是修正后的父子通信模式示范: ```html <!-- Parent Component --> <template> <ChildComponent :formData="parentData" @update-form-data="handleUpdate"/> </template> <script> export default { data() { return { parentData: {} }; }, methods: { handleUpdate(updatedFields) { Object.assign(this.parentData, updatedFields); } } } </script> ``` ```html <!-- Child Component --> <template> <el-select-v2 v-model="localFormData.fieldName"> <!-- Options Content --> </el-select-v2> </template> <script> export default { props: ['formData'], computed: { localFormData: { get() { return this.formData; }, set(newValue) { const changedPart = {}; changedPart['fieldName'] = newValue; this.$emit('update-form-data', changedPart); } } } } </script> ``` 这样既满足了响应式需求又规避掉潜在的风险点。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值