|
@@ -2,4 +2,304 @@
|
|
|
description: "小程序页面的开发指令"
|
|
description: "小程序页面的开发指令"
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-这是一个新的斜杠命令。编辑此文件以自定义命令行为。
|
|
|
|
|
|
|
+# 小程序页面开发指令
|
|
|
|
|
+
|
|
|
|
|
+## 概述
|
|
|
|
|
+本指令规范了基于Taro + React + Tailwind CSS的小程序页面开发流程,包含tabbar页和非tabbar页的创建标准和最佳实践。
|
|
|
|
|
+
|
|
|
|
|
+## 页面类型分类
|
|
|
|
|
+
|
|
|
|
|
+### 1. TabBar页面(底部导航页)
|
|
|
|
|
+特点:
|
|
|
|
|
+- 使用 `TabBarLayout` 布局组件
|
|
|
|
|
+- 路径配置在 `mini/src/app.config.ts` 中的 `tabBar.list`
|
|
|
|
|
+- 包含底部导航栏,用户可直接切换
|
|
|
|
|
+- 通常包含 `Navbar` 顶部导航组件
|
|
|
|
|
+- 示例页面:首页、发现、个人中心
|
|
|
|
|
+
|
|
|
|
|
+### 2. 非TabBar页面(独立页面)
|
|
|
|
|
+特点:
|
|
|
|
|
+- 不使用 `TabBarLayout`,直接渲染内容
|
|
|
|
|
+- 使用 `Navbar` 组件作为顶部导航
|
|
|
|
|
+- 需要手动处理返回导航
|
|
|
|
|
+- 示例页面:登录、注册、详情页
|
|
|
|
|
+
|
|
|
|
|
+## 开发流程
|
|
|
|
|
+
|
|
|
|
|
+### 1. 创建页面目录
|
|
|
|
|
+```bash
|
|
|
|
|
+# TabBar页面
|
|
|
|
|
+mkdir -p mini/src/pages/[页面名称]
|
|
|
|
|
+
|
|
|
|
|
+# 非TabBar页面
|
|
|
|
|
+mkdir -p mini/src/pages/[页面名称]
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 创建页面文件
|
|
|
|
|
+
|
|
|
|
|
+#### TabBar页面模板
|
|
|
|
|
+```typescript
|
|
|
|
|
+// mini/src/pages/[页面名称]/index.tsx
|
|
|
|
|
+import React from 'react'
|
|
|
|
|
+import { View, Text } from '@tarojs/components'
|
|
|
|
|
+import { TabBarLayout } from '@/layouts/tab-bar-layout'
|
|
|
|
|
+import { Navbar } from '@/components/ui/navbar'
|
|
|
|
|
+import './index.css'
|
|
|
|
|
+
|
|
|
|
|
+const [页面名称]Page: React.FC = () => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ <TabBarLayout activeKey="[对应tabBar.key]">
|
|
|
|
|
+ <Navbar
|
|
|
|
|
+ title="页面标题"
|
|
|
|
|
+ rightIcon="i-heroicons-[图标名称]-20-solid"
|
|
|
|
|
+ onClickRight={() => console.log('点击右上角')}
|
|
|
|
|
+ leftIcon=""
|
|
|
|
|
+ />
|
|
|
|
|
+ <View className="px-4 py-4">
|
|
|
|
|
+ {/* 页面内容 */}
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </TabBarLayout>
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export default [页面名称]Page
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 非TabBar页面模板
|
|
|
|
|
+```typescript
|
|
|
|
|
+// mini/src/pages/[页面名称]/index.tsx
|
|
|
|
|
+import { View } from '@tarojs/components'
|
|
|
|
|
+import { useEffect } from 'react'
|
|
|
|
|
+import Taro from '@tarojs/taro'
|
|
|
|
|
+import { Navbar } from '@/components/ui/navbar'
|
|
|
|
|
+import './index.css'
|
|
|
|
|
+
|
|
|
|
|
+export default function [页面名称]() {
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ Taro.setNavigationBarTitle({
|
|
|
|
|
+ title: '页面标题'
|
|
|
|
|
+ })
|
|
|
|
|
+ }, [])
|
|
|
|
|
+
|
|
|
|
|
+ return (
|
|
|
|
|
+ <View className="min-h-screen bg-gray-50">
|
|
|
|
|
+ <Navbar
|
|
|
|
|
+ title="页面标题"
|
|
|
|
|
+ backgroundColor="bg-transparent"
|
|
|
|
|
+ textColor="text-gray-900"
|
|
|
|
|
+ border={false}
|
|
|
|
|
+ />
|
|
|
|
|
+ <View className="px-6 py-4">
|
|
|
|
|
+ {/* 页面内容 */}
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 3. 页面配置文件
|
|
|
|
|
+```typescript
|
|
|
|
|
+// mini/src/pages/[页面名称]/index.config.ts
|
|
|
|
|
+export default definePageConfig({
|
|
|
|
|
+ navigationBarTitleText: '页面标题',
|
|
|
|
|
+ enablePullDownRefresh: true,
|
|
|
|
|
+ backgroundTextStyle: 'dark',
|
|
|
|
|
+ navigationBarBackgroundColor: '#ffffff',
|
|
|
|
|
+ navigationBarTextStyle: 'black'
|
|
|
|
|
+})
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 4. 样式文件
|
|
|
|
|
+```css
|
|
|
|
|
+/* mini/src/pages/[页面名称]/index.css */
|
|
|
|
|
+page {
|
|
|
|
|
+ background-color: #f5f5f5;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 自定义样式 */
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 页面模板示例
|
|
|
|
|
+
|
|
|
|
|
+### 1. TabBar页面标准结构
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 示例:首页
|
|
|
|
|
+import React from 'react'
|
|
|
|
|
+import { View, Text } from '@tarojs/components'
|
|
|
|
|
+import { TabBarLayout } from '@/layouts/tab-bar-layout'
|
|
|
|
|
+import { Navbar } from '@/components/ui/navbar'
|
|
|
|
|
+import { Button } from '@/components/ui/button'
|
|
|
|
|
+import './index.css'
|
|
|
|
|
+
|
|
|
|
|
+const HomePage: React.FC = () => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ <TabBarLayout activeKey="home">
|
|
|
|
|
+ <Navbar
|
|
|
|
|
+ title="首页"
|
|
|
|
|
+ rightIcon="i-heroicons-bell-20-solid"
|
|
|
|
|
+ onClickRight={() => console.log('点击通知')}
|
|
|
|
|
+ leftIcon=""
|
|
|
|
|
+ />
|
|
|
|
|
+ <View className="px-4 py-4">
|
|
|
|
|
+ <Text className="text-2xl font-bold text-gray-900">欢迎使用</Text>
|
|
|
|
|
+ <View className="mt-4">
|
|
|
|
|
+ <Text className="text-gray-600">这是一个简洁优雅的小程序首页</Text>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </TabBarLayout>
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export default HomePage
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 非TabBar页面标准结构
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 示例:登录页
|
|
|
|
|
+import { View } from '@tarojs/components'
|
|
|
|
|
+import { useEffect } from 'react'
|
|
|
|
|
+import Taro from '@tarojs/taro'
|
|
|
|
|
+import { Navbar } from '@/components/ui/navbar'
|
|
|
|
|
+import { Button } from '@/components/ui/button'
|
|
|
|
|
+import './index.css'
|
|
|
|
|
+
|
|
|
|
|
+export default function Login() {
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ Taro.setNavigationBarTitle({
|
|
|
|
|
+ title: '用户登录'
|
|
|
|
|
+ })
|
|
|
|
|
+ }, [])
|
|
|
|
|
+
|
|
|
|
|
+ return (
|
|
|
|
|
+ <View className="min-h-screen bg-gradient-to-br from-blue-50 via-white to-indigo-50">
|
|
|
|
|
+ <Navbar
|
|
|
|
|
+ title="用户登录"
|
|
|
|
|
+ backgroundColor="bg-transparent"
|
|
|
|
|
+ textColor="text-gray-900"
|
|
|
|
|
+ border={false}
|
|
|
|
|
+ />
|
|
|
|
|
+ <View className="flex-1 px-6 py-12">
|
|
|
|
|
+ {/* Logo区域 */}
|
|
|
|
|
+ <View className="flex flex-col items-center mb-10">
|
|
|
|
|
+ <View className="w-20 h-20 mb-4 rounded-full bg-white shadow-lg flex items-center justify-center">
|
|
|
|
|
+ <View className="i-heroicons-user-circle-20-solid w-12 h-12 text-blue-500" />
|
|
|
|
|
+ </View>
|
|
|
|
|
+ <Text className="text-2xl font-bold text-gray-900 mb-1">欢迎回来</Text>
|
|
|
|
|
+ </View>
|
|
|
|
|
+
|
|
|
|
|
+ {/* 表单区域 */}
|
|
|
|
|
+ <View className="bg-white rounded-2xl shadow-sm p-6">
|
|
|
|
|
+ <View className="space-y-5">
|
|
|
|
|
+ {/* 表单内容 */}
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 组件使用规范
|
|
|
|
|
+
|
|
|
|
|
+### 1. 布局组件
|
|
|
|
|
+- **TabBarLayout**: 用于tabbar页面,包含底部导航
|
|
|
|
|
+- **Navbar**: 顶部导航栏组件
|
|
|
|
|
+
|
|
|
|
|
+### 2. 表单组件
|
|
|
|
|
+- **Input**: 输入框组件
|
|
|
|
|
+- **Button**: 按钮组件
|
|
|
|
|
+- **Form**: 表单组件(基于react-hook-form)
|
|
|
|
|
+
|
|
|
|
|
+### 3. 业务组件
|
|
|
|
|
+- **AvatarUpload**: 头像上传组件
|
|
|
|
|
+- 根据需求可扩展更多业务组件
|
|
|
|
|
+
|
|
|
|
|
+## 路由配置
|
|
|
|
|
+
|
|
|
|
|
+### 1. TabBar页面配置
|
|
|
|
|
+```typescript
|
|
|
|
|
+// mini/src/app.config.ts
|
|
|
|
|
+export default defineAppConfig({
|
|
|
|
|
+ pages: [
|
|
|
|
|
+ 'pages/index/index',
|
|
|
|
|
+ 'pages/explore/index',
|
|
|
|
|
+ 'pages/profile/index',
|
|
|
|
|
+ // 其他页面
|
|
|
|
|
+ ],
|
|
|
|
|
+ tabBar: {
|
|
|
|
|
+ color: '#666666',
|
|
|
|
|
+ selectedColor: '#1976D2',
|
|
|
|
|
+ backgroundColor: '#ffffff',
|
|
|
|
|
+ borderStyle: 'black',
|
|
|
|
|
+ list: [
|
|
|
|
|
+ {
|
|
|
|
|
+ pagePath: 'pages/index/index',
|
|
|
|
|
+ text: '首页',
|
|
|
|
|
+ iconPath: 'assets/icons/home.png',
|
|
|
|
|
+ selectedIconPath: 'assets/icons/home-active.png'
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ pagePath: 'pages/explore/index',
|
|
|
|
|
+ text: '发现',
|
|
|
|
|
+ iconPath: 'assets/icons/explore.png',
|
|
|
|
|
+ selectedIconPath: 'assets/icons/explore-active.png'
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ pagePath: 'pages/profile/index',
|
|
|
|
|
+ text: '我的',
|
|
|
|
|
+ iconPath: 'assets/icons/profile.png',
|
|
|
|
|
+ selectedIconPath: 'assets/icons/profile-active.png'
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 非TabBar页面路由
|
|
|
|
|
+非TabBar页面会自动添加到pages数组中,无需额外配置tabBar。
|
|
|
|
|
+
|
|
|
|
|
+## 最佳实践
|
|
|
|
|
+
|
|
|
|
|
+### 1. 命名规范
|
|
|
|
|
+- 页面目录:使用小写+中划线命名,如 `user-profile`
|
|
|
|
|
+- 组件名称:使用PascalCase,如 `UserProfilePage`
|
|
|
|
|
+- 文件名:使用小写+中划线命名,如 `user-profile.tsx`
|
|
|
|
|
+
|
|
|
|
|
+### 2. 样式规范
|
|
|
|
|
+- 使用Tailwind CSS原子类
|
|
|
|
|
+- 避免使用px,使用rpx单位
|
|
|
|
|
+- 页面背景色统一使用 `bg-gray-50` 或 `bg-white`
|
|
|
|
|
+
|
|
|
|
|
+### 3. 状态管理
|
|
|
|
|
+- 使用React hooks进行状态管理
|
|
|
|
|
+- 复杂状态使用Context API
|
|
|
|
|
+- 用户信息使用 `useAuth` hook
|
|
|
|
|
+
|
|
|
|
|
+### 4. 错误处理
|
|
|
|
|
+- 使用Taro.showToast显示错误信息
|
|
|
|
|
+- 网络请求使用try-catch包裹
|
|
|
|
|
+- 提供友好的用户反馈
|
|
|
|
|
+
|
|
|
|
|
+### 5. 性能优化
|
|
|
|
|
+- 使用懒加载组件
|
|
|
|
|
+- 避免不必要的重新渲染
|
|
|
|
|
+- 合理使用useMemo和useCallback
|
|
|
|
|
+
|
|
|
|
|
+## 常用工具函数
|
|
|
|
|
+
|
|
|
|
|
+### 1. 页面跳转
|
|
|
|
|
+```typescript
|
|
|
|
|
+// Tab页面跳转
|
|
|
|
|
+Taro.switchTab({ url: '/pages/index/index' })
|
|
|
|
|
+
|
|
|
|
|
+// 普通页面跳转
|
|
|
|
|
+Taro.navigateTo({ url: '/pages/login/index' })
|
|
|
|
|
+
|
|
|
|
|
+// 返回上一页
|
|
|
|
|
+Taro.navigateBack()
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 用户交互
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 显示提示
|
|
|
|
|
+Taro.showToast({
|