时里院子市集
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

4.7 KiB

导航工具迁移指南

🎯 迁移目标

将项目中的 Taro.navigateToTaro.switchTab 等调用替换为新的导航工具函数。

📋 迁移对照表

1. 基础导航

// 旧写法 ❌
Taro.navigateTo({ url: '/pages/product/detail' })

// 新写法 ✅
goTo('product/detail')

2. 带参数导航

// 旧写法 ❌
Taro.navigateTo({ 
  url: `/pages/search/index?keywords=${encodeURIComponent(keywords)}` 
})

// 新写法 ✅
goTo('search/index', { keywords })

3. TabBar 页面

// 旧写法 ❌
Taro.switchTab({ url: '/pages/index/index' })

// 新写法 ✅
switchTab('index/index')

4. 页面替换

// 旧写法 ❌
Taro.redirectTo({ url: '/pages/login/index' })

// 新写法 ✅
redirectTo('login/index')

5. 重新启动

// 旧写法 ❌
Taro.reLaunch({ url: '/pages/home/index' })

// 新写法 ✅
reLaunch('home/index')

🔄 具体迁移示例

示例1:搜索页面

// 旧代码
const onQuery = () => {
  Taro.navigateTo({
    url: `/shop/search/index?keywords=${encodeURIComponent(keywords.trim())}`
  });
}

// 新代码
import { goTo } from '@/utils/navigation';

const onQuery = () => {
  goTo('shop/search/index', { keywords: keywords.trim() });
}

示例2:商品详情

// 旧代码
const viewProduct = (productId: number) => {
  Taro.navigateTo({
    url: `/pages/product/detail?id=${productId}&from=list`
  });
}

// 新代码
import { goTo } from '@/utils/navigation';

const viewProduct = (productId: number) => {
  goTo('product/detail', { id: productId, from: 'list' });
}

示例3:TabBar切换

// 旧代码
const goHome = () => {
  Taro.switchTab({ url: '/pages/index/index' });
}

// 新代码
import { switchTab } from '@/utils/navigation';

const goHome = () => {
  switchTab('index/index');
}

示例4:登录跳转

// 旧代码
const handleLogin = () => {
  Taro.redirectTo({ url: '/pages/login/index' });
}

// 新代码
import { redirectTo } from '@/utils/navigation';

const handleLogin = () => {
  redirectTo('login/index');
}

🛠️ 批量替换脚本

可以使用以下正则表达式进行批量替换:

1. 简单导航替换

# 查找
Taro\.navigateTo\(\{\s*url:\s*['"`]([^'"`]+)['"`]\s*\}\)

# 替换为
goTo('$1')

2. switchTab替换

# 查找
Taro\.switchTab\(\{\s*url:\s*['"`]([^'"`]+)['"`]\s*\}\)

# 替换为
switchTab('$1')

3. redirectTo替换

# 查找
Taro\.redirectTo\(\{\s*url:\s*['"`]([^'"`]+)['"`]\s*\}\)

# 替换为
redirectTo('$1')

📦 导入语句

在每个需要使用导航的文件顶部添加:

import { goTo, switchTab, redirectTo, reLaunch, goBack } from '@/utils/navigation';

⚠️ 注意事项

1. 路径格式化

新工具会自动处理路径格式:

// 这些写法都会被自动转换为 /pages/product/detail
goTo('product/detail')
goTo('/product/detail')
goTo('pages/product/detail')
goTo('/pages/product/detail')

2. 参数处理

// 旧写法需要手动编码
const url = `/pages/search?keyword=${encodeURIComponent(keyword)}&type=${type}`;

// 新写法自动处理编码
goTo('search', { keyword, type });

3. 特殊路径

对于非 /pages/ 开头的路径(如分包页面),工具会保持原样:

goTo('/subPages/vip/index')  // 保持不变
goTo('/packageA/user/profile')  // 保持不变

🎉 迁移收益

1. 代码更简洁

// 旧:42个字符
Taro.navigateTo({ url: '/pages/product/detail' })

// 新:22个字符
goTo('product/detail')

2. 参数处理更方便

// 旧:需要手动拼接和编码
const url = `/pages/search?q=${encodeURIComponent(query)}&page=${page}`;
Taro.navigateTo({ url });

// 新:自动处理
goTo('search', { q: query, page });

3. 错误处理更统一

// 新工具自动包含错误处理
goTo('some/page').catch(error => {
  // 自动显示错误提示
});

4. TypeScript支持更好

// 完整的类型提示和检查
navigateTo({
  url: 'product/detail',
  params: { id: 123 },
  success: () => console.log('成功'),
  fail: (error) => console.error(error)
});

📋 迁移检查清单

  • 替换所有 Taro.navigateTo 调用
  • 替换所有 Taro.switchTab 调用
  • 替换所有 Taro.redirectTo 调用
  • 替换所有 Taro.reLaunch 调用
  • 添加必要的导入语句
  • 测试所有页面跳转功能
  • 验证参数传递正确性
  • 检查错误处理是否正常

完成迁移后,你的导航代码将更加简洁、安全和易维护!