React-HOH前端共学week2 项目学习笔记

😀 大家好: 这次我以一个实际学习的 Web3 项目为例,一步步了解 React 开发中的重要概念。最近学习前端的知识,深知入门时的困惑,所以这次用最通俗的语言,结合实际代码来学习。

⚠️这次的代码示例,用的是HOH老陈老师给我们提到一个典范用例去学习。

1. 项目结构:你的代码应该放在哪里?

首先,让我们看看一个典型的 React 项目是怎么组织的:

bash 复制代码
src/
  ├── components/     # 可重用的组件
  │   ├── ui/        # 基础UI组件
  │   └── business/  # 业务组件
  ├── pages/         # 页面组件
  ├── lib/           # 工具函数和库
  ├── type/          # TypeScript 类型定义
  ├── App.tsx        # 应用程序的主入口
  └── main.tsx       # 渲染入口

这就像是整理你的房间:

  • components 就像你的工具箱,放着经常用到的小工具
  • pages 就像房间的不同区域,每个区域有特定的用途
  • lib 就像是收纳盒,存放各种通用的小物件
  • type 就像是使用说明书,告诉大家东西该怎么用

2. 路由:如何在页面间切换?

看看我们的 App.tsx

javascript 复制代码
function App() {
  return (    
    <Router>
      <div className="bg-background">
        <NaviBar />
        <Routes>
          <Route path="/" element={<Main />} />
          <Route path="/user" element={<User />} />
        </Routes>
      </div>
    </Router>
  );
}

这就像是给你的网站画了一张地图:

  • Router 就是整个地图的边框
  • Routes 就像是地图上的路线
  • Route 就是具体的目的地
  • path="/" 就是主页,像家的位置
  • path="/user" 就是用户页面,像是你常去的商店

3. 组件:积木游戏

导航栏组件:

javascript 复制代码
function NaviBar() {
return (
<nav className="flex items-center justify-between p-4">
<div className="flex items-center space-x-4">
<Link to="/">首页</Link>
<Link to="/user">用户</Link>
</div>
<WalletStatus />
</nav>
);
}

组件就像乐高积木:

  • 每个组件都是一个独立的积木块
  • Link 组件就像是门,让你能去到其他房间
  • className 就像是积木的颜色和形状
  • WalletStatus 是另一个积木块,专门显示钱包状态

4. Hooks:组件的记忆力

基础 Hooks

scss 复制代码
function UserProfile() {
    // 状态管理:就像是记事本
    const [profile, setProfile] = useState(null);
    
    // 就像是定时任务
    useEffect(() => {
        // 获取用户资料
        fetchUserProfile();
    }, []);
    
    // 回调函数:就像是预设好的操作指南
    const handleUpdate = useCallback(() => {
        updateProfile();
    }, []);
}

自定义 Hooks (复用)

scss 复制代码
function useWallet() {
    const [isConnected, setIsConnected] = useState(false);
    const [balance, setBalance] = useState(0);
    
    useEffect(() => {
        // 监听钱包连接状态
        const checkConnection = async () => {
            // 检查逻辑
        };
        checkConnection();
    }, []);
    
    return { isConnected, balance };
}

Hooks 就像是给组件装上了不同功能的芯片:

  • useState 就像是记事本,能记住数字、文字等信息
  • useEffect 就像是一个自动执行的任务清单
  • [] 依赖数组就像是触发条件,告诉任务什么时候该执行

5.状态管理进阶

本地状态管理

csharp 复制代码
const [displayProfile, setDisplayProfile] = useState<DisplayProfile | null>(null);

就像是组件的私人笔记本:

  • 只有自己能看到和修改
  • 数据变化时会自动更新界面
  • 适合管理组件内部的临时数据

全局状态管理

javascript 复制代码
const WalletContext = React.createContext({
				address: null,
				connect: () => {},
				disconnect: () => {}
				})

就像是公共告示板:

  • 所有组件都能看到
  • 数据变化时相关组件都会更新
  • 适合管理需要共享的数据

6. 样式

项目使用了 Tailwind CSS(一个样式工具库) +Shadcn (UI组件库)

css 复制代码
<div className="flex items-center justify-between p-4 bg-white shadow-md">

项目中常用的几个样式:

  • flex 就像是把东西排成一行
  • items-center 就像是让所有东西垂直居中
  • p-4 就像是给内容加上内边距
  • bg-white 就像是刷上白色油漆
  • shadow-md 就像是给元素加上阴影,让它看起来立体一点

我个人的学习方法是样式部分基本都是现用现查,不去记忆。

7.智能合约交互

查询链上状态

tsx 复制代码
export const queryState = async () => {
    const events = await suiClient.queryEvents({
        query: {
            MoveEventType: `${networkConfig.testnet.packageID}::week_two::ProfileCreated`
        }
    })
    const state: State = {
        users: []
    }
    events.data.map((event) => {
        const user = event.parsedJson as User;
        state.users.push(user);
    })
    return state;
}

这就像是:

  • 查看区块链上的"公告板"
  • 找到所有创建用户档案的记录
  • 整理成前端可以使用的格式

查询用户档案

tsx 复制代码
export const queryProfile = async (address: string) => {
    if (!isValidSuiAddress(address)) {
        throw new Error("Invalid profile address");
    }
    const profileContent = await suiClient.getObject({
        id: address,
        options: {
            showContent: true
        }
    })
    // ... 数据处理逻辑
}
  • 先检查地址是否有效
  • 根据地址查找用户的档案
  • 将链上数据转换为可用格式

8.交易处理

创建用户档案

tsx 复制代码
export const createProfileTx = (name: string, description: string) => {
    return Transaction.create()
        .moveCall({
            target: `${networkConfig.testnet.packageID}::week_two::create_profile`,
            arguments: [name, description],
        });
}
  • 填写一份创建档案的表单
  • 准备提交到区块链
  • 等待区块链确认

⚠️ 在有些的智能合约和前端交互的功能会用到 PTB 交易块 or 签名交易 为的是保证交易的成功和防止篡改。

8.GraphQL 查询

部分code:

tsx 复制代码
const queryFolderDataContext = graphql(`
    query queryFolderDataContext($address:SuiAddress!) {
        object(address:$address){
            dynamicFields{
                nodes{
                    name{
                        json
                    }
                    value{
                    ...on MoveValue{
                            json
                        }
                    }
                }
            }
        }
    }
    `)
  • 一次获取多个相关数据
  • 减少网络请求次数
  • 更高级的查询语言

💡 有关React使用上的问题,欢迎您在底部评论区留言,一起交流~

💧 HOH水分子公众号

🌊 HOH水分子X账号

⭐️ HOH水分子Github社区

相关推荐
GISer_Jing2 小时前
React中用到的Javascript设计模式详解
javascript·react.js·设计模式
GISer_Jing2 小时前
React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目
前端·react.js·前端框架
风茫3 小时前
掌握 React 高阶组件与高阶函数:构建可复用组件的新境界
javascript·react.js
answerball1 天前
告别“单页”寂寞:React Router 带你飞,页面跳转像滑滑梯! 🎢
前端·react.js
呵呵哒( ̄▽ ̄)"1 天前
React 配置小组件
react.js
傻小胖1 天前
React 中hooks之useReducer使用场景和方法总结
前端·javascript·react.js
hikktn1 天前
【开源宝藏】Jeepay VUE和React构建WebSocket通用模板
vue.js·react.js·开源
Mae_cpski1 天前
【React学习笔记】第三章:React应用
笔记·学习·react.js
不叫猫先生1 天前
【React】函数组件底层渲染机制
前端·javascript·react.js