彻底搞懂自定义Hook函数和路由钩子函数

简介: 彻底搞懂自定义Hook函数和路由钩子函数

什么是自定义Hook?

  • 自定义Hook是标准的封装和共享逻辑的方式。
  • 自定义Hook是一个函数,其名称以use开头。
  • 自定义Hook其实就是逻辑和内置的Hook的组合。

通俗的说,自定义Hook就是对组件间共用逻辑的封装,其名称以use开头。

实例一:封装共有请求

假设我们在组件挂载完成之后,需要对远程服务器发送一个GET请求,获取到文章数据,然后显示在页面中,我们可以通过下面的写法来完成,将获取数据折翼共有操作进行封装。

function useGetPost() {
    const [post,setPost] = useState({});
    useEffect(() => {
        axios.get('https://jsonplaceholder.typicode.com/posts/1')
            .then(res => setPost(res.data));
    },[])
    return [post,setPost];
}
function App() {
    const [post] = useGetPost();
    return (
        <div>
            <h1>{post.title}</h1>
            <div>{post.body}</div>
        </div>
    )
}
复制代码

实例二:封装输入框的value和onChange属性

在Form表单中输入框的value和onChange属性是十分重要的,也是使用非常频繁的,如果针对每一个输入框都单独写onChange函数是非常臃肿的,通过自定义Hook进行封装则极大提高了便利性。

// 定义自定义Hook:获取input的value和onChange
function useUpdateInput(initialValue) {
    const [value,setValue] = useState(initialValue);
    return {
        value,
        onChange: e => setValue(e.target.value)
    }
}
function App() {
    const usernameInput = useUpdateInput('');
    const passwordInput = useUpdateInput('')
    const submitForm = (event) => {
        event.preventDefault();
        console.log(usernameInput.value);
        console.log(passwordInput.value);
    }
    return (
        <form onSubmit={submitForm}>
            <input type="text" name="username" {...usernameInput}/>
            <input type="password" name="password" {...passwordInput} />
            <input type="submit" />
        </form>
    )
}
复制代码

什么是路由钩子函数?

React路由钩子函数是react-router-dom这个库提供的,主要提供了以下四个钩子函数:

  • useHistory
  • useLocation
  • useRouteMatch
  • useParams

注意:Link和Route必须在同一个路由器上,这个路由器可以是HashRouter也可以是BrowserRouter,Link to指示路由跳转到哪个组件,Route path 指示component

路由组件获取History、Location、Match与Params

这里要想获取到Params需要使用动态路由。

  • App组件
function App() {
    return (
        <div>
            <div>
                <Link to='/home/xiaoming'>首页</Link>
                <Link to='/list'>列表页</Link>
            </div>
            <div>
                <Route path='/home/:name' component={Home}/>
                <Route path='/list' component={List}/>
            </div>
        </div>
    )
}
ReactDOM.render(<Router>
    <App />
</Router>, document.querySelector('#root'));
复制代码
  • Home组件(路由组件)
import {useHistory,useLocation,useRouteMatch,useParams} from 'react-router-dom'
import React from 'react';
const Home = (props) => {
    console.log(useHistory());
    console.log(useLocation());
    console.log(useRouteMatch());
    console.log(useParams());
    return (
        <div>
            这是Home组件
        </div>
    );
}
export default Home;


相关文章
|
JavaScript 前端开发
“Vue进阶:深入理解插值、指令、过滤器、计算属性和监听器“
“Vue进阶:深入理解插值、指令、过滤器、计算属性和监听器“
48 0
|
3月前
|
JavaScript API
vue使用hook:声明周期来监听子组件的声明周期
本文介绍了如何在Vue中使用生命周期钩子来监听子组件的生命周期事件,包括在子组件内部监听和在父组件中监听子组件的生命周期钩子。
55 0
|
1月前
|
UED 开发者
ArkTS路由跳转与参数传递:深入理解与实践
在HarmonyOS应用开发中,ArkTS作为主要开发语言,其路由跳转和参数传递机制是实现页面间通信的关键。本文深入探讨了ArkTS中的路由跳转基础,包括页面跳转的方式(如pushUrl和replaceUrl)、参数传递的方法,以及如何在实际开发中应用这些知识,帮助开发者提升应用的用户体验和性能。
282 1
|
2月前
|
JavaScript API
vue3知识点:自定义hook函数
vue3知识点:自定义hook函数
28 2
在路由守卫中使用箭头函数时,如何处理组件的生命周期钩子函数?
在路由守卫中使用箭头函数时,如何处理组件的生命周期钩子函数?
|
7月前
|
前端开发 API 数据处理
useEffect 实践案例(2):自定义 hook
useEffect 实践案例(2):自定义 hook
|
缓存 JavaScript 前端开发
【Vue】深究计算和侦听属性的原理
【Vue】深究计算和侦听属性的原理
|
存储 小程序
小程序路由传参的方法
小程序路由传参的方法
332 0
|
JavaScript API
自定义hook是什么
自定义hook是什么
|
前端开发
封装 useUpdate 钩子
封装 useUpdate 钩子
103 0

热门文章

最新文章