[PReact] Handle Simple Routing with preact-router

Some applications only need a very minimal routing solution. This lesson will cover a practical example showing the router in use. We’ll build a simple search feature that accepts user input and then calls the github API. We’ll see how to access route parameters, how to manually & automatically navigate around, and finally how to handle un-matched path. https://github.com/developit/preact-router

 

Install:

npm install --save preact-router

 

Define routers:

复制代码
import {h} from 'preact';
import { Router } from 'preact-router';
import Profile from './Profile';
import Home from './Home';
import Error from './Error';

export default function App() {
    return (
        <Router>
            <Home path="/" />
            <Profile path="/profile/:user"/>
            <Error default/>
        </Router>
    );
}
复制代码

 

Defailt Error router:

复制代码
import {h} from 'preact';
import {route} from 'preact-router';

const back = (e) => {
    route('/');
};

export default Error = () => (
    <div>
        <h2>Error!</h2>
        <button onClick={e => back(e)}>Home</button>
    </div>
);
复制代码

 

Home: preact call route() function to navigate between components.

复制代码
import { h } from 'preact';
import { route } from 'preact-router';

function search(query) {
    route(`/profile/${encodeURIComponent(query)}`);
}

export default function Home() {
    return (
        <section>
            <p>Enter a Github Username</p>
            <input type="search"
                   placeholder="username"
                   onSearch={e => search(e.target.value)}
            />
        </section>
    );
}
复制代码

 

Profile.js: Stateful component, fetching data:

复制代码
import {h, Component} from 'preact';
import User from './User';


const config = {
    url: 'https://api.github.com/users'
};

export default class Profile extends Component {
    constructor(props) {
        super(props);

        this.state = {
            loading: true,
            user: null
        };
    }

    componentDidMount() {
        fetch(`${config.url}/${this.props.user}`)
            .then(resp => resp.json())
            .then(user => {
                this.setState({
                                  user,
                                  loading: false
                              });
            })
            .catch(err => console.error(err));
    }


    render({user: username}, {loading, user: userState}) {
        return (
            <div class="app">
                {loading
                    ? <p>Fetching {username}'s profile</p>
                    : <User image={userState.avatar_url}
                            name={userState.name} />
                }
            </div>
        );
    }
}
复制代码

 

posted @   Zhentiw  阅读(473)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2015-06-18 [Node.js] Node.js Buffers
点击右上角即可分享
微信分享提示