草庐IT

React-Router6:从入门到实战最佳指南

CoderBin 2023-03-28 原文

前言

大家好,我是CoderBin。前段时间学了 react-router5 后才知道出了6,经典白学?...

所以,本文将总结 react-router6 的常用操作,以理论+代码+注释的形式教同学们入门 react 路由,看完本篇文章相信你能够独立完成路由的相关案例。对于已经会的人来说就当是复习巩固吧?

如果本文有不对、疑惑的地方,欢迎在评论区留言指正?

一、概述及说明

概述:想了解更多详细知识,可前往 React-Router6官网

引用:在客户端路由的十年历程中,React Router v6 采用了以前版本及其姊妹项目 Reach Router 的最佳功能,这是我们迄今为止最小、功能最强大的软件包。

1. React Router 以三个不同的包发布到 npm 上,它们分别为:

  1. react-router: 路由的核心库,提供了很多的:组件、钩子。
  2. react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM 的组件,例如 <BrowserRouter>等。
  3. react-router-native: 包括react-router所有内容,并添加一些专门用于ReactNative的API,例如:<NativeRouter>等。
2. 与React Router 5.x 版本相比,改变了什么?

  1. 内置组件的变化:移除<Switch/> ,新增 <Routes/>等。

  2. 语法的变化:component={About} 变为 element={<About/>}等。

  3. 新增多个hook:useParamsuseNavigateuseMatch等。

  4. 官方明确推荐函数式组件了!!!

二、安装

yarn add react-router-dom@6 or

npm install react-router-dom@6

三、路由的基本使用

1. 路由的使用步骤

  • 在组件中导入对应路由链接组件,并设置路由链接
  • 在组件中导入 Route 渲染组件,注册路由
  • 在 index.js 中导入路由组件,在 <App> 的最外侧包裹一个 <BrowserRouter><HashRouter>
    • <BrowserRouter> 表示 history 模式的路由
    • <HashRouter> 表示 Hash 模式的路由

2. 代码示例

App.jsx

import React from 'react' // 导入 React 内置组件 import { Link, Routes, Route } from 'react-router-dom' import Home from './pages/Home' import About from './pages/About' export default function App() { return ( <div> {/* 设置路由链接 */} {/* className 接收一个函数,可以改变激活的类名 */} <Link className='list-group-item' to="/about">About</Link> <Link className='list-group-item' to="/home">Home</Link> {/* 注册路由 */} {/* 必须用 Routes 组件进行包裹*/} {/* Route 组件的 element 属性值为对应的组件*/} {/* caseSensitive 严格区分大小写*/} <Routes> <Route path="/about" caseSensitive element={<About/>}></Route> <Route path="/home" element={<Home />}></Route> </Routes> </div> ) } index.js

import { createRoot } from "react-dom/client"; import App from './App' // 这里使用的是 history 模式的路由 import {BrowserRouter} from 'react-router-dom' // 注意:这里使用的 React18 的写法 const root = createRoot(document.getElementById('root')) root.render( <BrowserRouter> <App/> </BrowserRouter> ) 总结:以上使用到了 Link、Routes、Route、BrowserRouter 等组件,后面会详细解释

四、路由重定向

作用:只要<Navigate>组件被渲染,就会修改路径,切换视图。

<Route path='/' element={<Navigate to='/home '/>}></Route>

App.jsx

import React from 'react' import { Link, Routes, Route } from 'react-router-dom' import Home from './pages/Home' import About from './pages/About' export default function App() { return ( <div> {/* 设置路由链接 */} <Link className='list-group-item' to="/about">About</Link> <Link className='list-group-item' to="/home">Home</Link> {/* 注册路由 */} <Routes> <Route path="/about" caseSensitive element={<About/>}></Route> <Route path="/home" element={<Home />}></Route> {/* Navigate 组件,页面一渲染就显示对应组件,可实现重定向效果 */} <Route path='/' element={<Navigate to='/about '/>}></Route> </Routes> </div> ) }

五、NavLink 高亮

import React from 'react' import { NavLink, Routes, Route } from 'react-router-dom' import Home from './pages/Home' import About from './pages/About' export default function App() { return ( <div> {/* 设置路由链接 */} <NavLink to="/about">About</NavLink> <NavLink to="/home">Home</NavLink> {/* 注册路由 */} <Routes> <Route path="/about" caseSensitive element={<About/>}></Route> <Route path="/home" element={<Home />}></Route> </Routes> </div> ) }

六、路由映射表

说明:路由映射表其实是一个数组,里面使用对象来表示每一个路径与组件之间的对应关系(如果是子路由需要使用<Outlet> 路由占位符展示组件)

src/routes/index.js 新建一个js文件编写路由映射表并导出

import { Navigate } from 'react-router-dom' import About from '../pages/About' import Home from '../pages/Home' // 路由映射表 const routes = [ { path: '/home', element: <Home />, }, { path: '/about', element: <About/> }, // 路由重定向 { path: '/', element: <Navigate to='/home'/> } ] export default routes App.jsx

import React from 'react' import { NavLink, useRoutes } from 'react-router-dom' // 导入编写好的路由映射表 import routes from './routes' export default function App() { return ( <div> <div className="list-group"> {/* 设置路由链接 */} <NavLink className='list-group-item' to="/about">About</NavLink> <NavLink className='list-group-item' to="/home">Home</NavLink> </div> <div className="panel-body"> {/* 注册路由 */} {/* 调用 useRoutes() hooks,嵌入路由映射表 */} {useRoutes(routes)} </div> </div> ) }

七、嵌套路由

直接在路由映射表中使用 children 选项实现嵌套路由

routes.js

import { Navigate } from 'react-router-dom' import About from '../pages/About' import Home from '../pages/Home' import Message from '../pages/Home/Message' import News from '../pages/Home/News' // 路由映射表 const routes = [ { path: '/home', element: <Home />, // children 选项,用于实现嵌套路由 // 注意:子路由只需要写路径名称,不需要 "/" children: [ {path: 'news', element: <News/>}, {path: 'message', element: <Message/>} ] }, { path: '/about', element: <About/> }, // 路由重定向 { path: '/', element: <Navigate to='/home'/> } ] export default routes 然后在 Home 组件中,设置路由占位符

Home.jsx

import React from 'react' import { NavLink, Outlet } from 'react-router-dom' export default function Home() { return ( <div> <h3>我是 Home 组件的内容</h3> <div> <ul className="nav nav-tabs"> <li> {/* 设置路由链接 */} {/* to 属性值的路径有三种写法 */} <NavLink className='list-group-item' to='/home/news'>新闻</NavLink> {/* <NavLink className='list-group-item' to='./news'>新闻</NavLink> */} {/* <NavLink className='list-group-item' to='news'>新闻</NavLink> */} </li> <li> <NavLink className='list-group-item' to='/home/message'>消息</NavLink> </li> </ul> {/* Outlet 路由占位符,表示"路由映射表"中匹配的组件将在此处展示 */} <Outlet/> </div> </div> ) }

八、路由的参数传递

1. 向路由组件传递 params 参数

步骤:

  1. 传递 params 参数,在路径后面用 / 进行拼接
  2. 在路由表中定义接收路由参数
  3. 对应组件使用 useParams() hooks 接收参数
Message.jsx 传递参数的组件

import React, { useState } from 'react' import { Link, Outlet } from 'react-router-dom' export default function Message() { const [message] = useState([ {id: 1, title: 'message1', content: '努力学习'}, {id: 2, title: 'message2', content: '学习React'}, {id: 3, title: 'message3', content: '前端工程师'}, ]) return ( <div> <ul> { message.map(m => { return ( <li key={m.id}> {/* 1. 传递 params 参数,在路径后面用 / 进行拼接 */} <Link to={`detail/${m.id}/${m.title}/${m.content}`}>{m.title}</Link> </li> ) }) } </ul> <hr /> {/* 2. 在路由表中定义接收路由参数 path: 'detail/:id/:title/:content' */} {/* 3. 路由占位符 */} <Outlet/> </div> ) } routes.js 路由映射表

import { Navigate } from 'react-router-dom' import About from '../pages/About' import Home from '../pages/Home' import Message from '../pages/Home/Message' import News from '../pages/Home/News' import Detail from '../pages/Home/Message/Detail' // 路由映射表 const routes = [ { path: '/home', element: <Home />, children: [ {path: 'news', element: <News/>}, { path: 'message', element: <Message />, children: [ // 声明接收参数 {path: 'detail/:id/:title/:content', element: <Detail/>} ] }, {path: '/home', element: <Navigate to='news'/>} ] }, { path: '/about', element: <About/> }, { path: '/', element: <Navigate to='/home'/> } ] export default routes Detail.jsx 接收参数的组件

import React from 'react' import { useMatch, useParams } from 'react-router-dom' export default function Detail() { // 1. 调用 useParams() hooks,获取传递过来的 params 参数,返回一个参数对象,可以通过解构得出数据 const { id, title, content } = useParams() // 2. 调用 useMatch() hooks,传入完成路径,也可以获取到 params 参数,但是不常用 const data = useMatch('/home/message/detail/:id/:title/:content') console.log(data); return ( <div> <ul> <li>消息编号:{ id }</li> <li>消息标题:{ title }</li> <li>消息内容:{content}</li> </ul> </div> ) }

2. 向路由组件传递 search 参数

步骤

  1. 传递 params 参数,在路径后面用 / 进行拼接
  2. 对应组件使用 useSearchParams() hooks 接收参数 Message.jsx 传递参数的组件
import React, { useState } from 'react' import { Link, Outlet } from 'react-router-dom' export default function Message() { const [message] = useState([ {id: 1, title: 'message1', content: '努力学习'}, {id: 2, title: 'message2', content: '学习React'}, {id: 3, title: 'message3', content: '前端工程师'}, ]) return ( <div> <ul> { message.map(m => { return ( <li key={m.id}> {/* 1. 传递 search 参数,在路径后面用 ? 进行拼接 */} <Link to={`detail?id=${m.id}&title=${m.title}&content=${m.content}`}>{m.title}</Link> </li> ) }) } </ul> <hr /> {/* 2. 不需要在路由表中定义接收路由参数 */} {/* 3. 路由占位符 */} <Outlet/> </div> ) } Detail.jsx 接收参数的组件

import React from 'react' import { useLocation, useSearchParams } from 'react-router-dom' export default function Detail() { // 1. 调用 useSearchParams() hooks,获取传递过来的 search 参数 // 通过数组解构的方法,获取 search(URLSearchParams) 对象 const [search, setSearch] = useSearchParams() // 通过 get('search') 方法,获取 search 参数 const id = search.get('id') const title = search.get('title') const content = search.get('content') // 使用 useLocation() hooks,得到一个location对象,也可以获取 search参数,但是比较麻烦,不常用 const location = useLocation() console.log('location',location); return ( <div> <ul> {/* 调用 setSearch() 方法,可以改变传递过来的 search */} <button onClick={()=>setSearch('id=004&title=测试&content=测试')}>点击更新收到的search参数</button> <li>消息编号:{ id }</li> <li>消息标题:{ title }</li> <li>消息内容:{content}</li> </ul> </div> ) }

3. 向路由组件传递 state 参数

步骤

  1. 传递 params 参数,在路径后面用 / 进行拼接
  2. 对应组件使用 useLocation() hooks 接收参数
Message.jsx 传递参数的组件

import React, { useState } from 'react' import { Link, Outlet } from 'react-router-dom' export default function Message() { const [message] = useState([ {id: 1, title: 'message1', content: '努力学习'}, {id: 2, title: 'message2', content: '学习React'}, {id: 3, title: 'message3', content: '前端工程师'}, ]) return ( <div> <ul> { message.map(m => { return ( <li key={m.id}> {/* 1. 传递 state 参数,添加 state 属性,值为一个对象 */} <Link to='detail' state={{id:m.id, title:m.title, content:m.content}}>{m.title}</Link> </li> ) }) } </ul> <hr /> {/* 2. 不需要在路由表中定义接收路由参数 */} {/* 3. 路由占位符 */} <Outlet/> </div> ) } Detail.jsx 接收参数的组件

import React from 'react' import { useLocation } from 'react-router-dom' export default function Detail() { // 调用 useLocation() hooks,通过解构得到一个 state 对象,里面可以拿到传递过来的参数 // 这里通过连续解构赋值,直接取到参数 const { state: { id, title, content } } = useLocation() return ( <div> <ul> <li>消息编号:{id}</li> <li>消息标题:{title}</li> <li>消息内容:{content}</li> </ul> </div> ) }

九、路由的编程式导航

使用 useNavigate() hooks 可以实现路由的编程式导航

Message.jsx

import React, { useState } from 'react' import { Link, Outlet, useNavigate } from 'react-router-dom' export default function Message() { const [message] = useState([ {id: 1, title: 'message1', content: '努力学习'}, {id: 2, title: 'message2', content: '学习React'}, {id: 3, title: 'message3', content: '前端工程师'}, ]) // 调用 useNavigate() hooks 可以实现编程式导航 // 接收两个参数:目标路径, 配置对象 // 配置对象:仅支持 replace 和 state 属性,replace表示跳转的模式,state表示传递的state参数 const navigate = useNavigate() function showDetail(m) { navigate('detail', { replace: true, state: { id: m.id, title: m.title, content: m.content } }) } return ( <div> <ul> { message.map(m => { return ( <li key={m.id}> {/* 设置路由链接 */} <Link to='detail' state={{id:m.id, title:m.title, content:m.content}}>{m.title}</Link> {/* 编程式导航 */} <button onClick={() => showDetail(m)}>查看详情</button> </li> ) }) } </ul> <hr /> {/* 路由占位符 */} <Outlet/> </div> ) }

十、组件总结

1. <BrowserRouter>

  1. 说明:<BrowserRouter>用于包裹整个应用。

  2. 示例代码:

import { createRoot } from "react-dom/client"; import App from './App' import {BrowserRouter} from 'react-router-dom' const root = createRoot(document.getElementById('root')) root.render( <BrowserRouter> <App/> </BrowserRouter> )

2. <HashRouter>

  1. 说明:作用与<BrowserRouter>一样,但<HashRouter>修改的是地址栏的hash值。
  2. 备注:6.x版本中<HashRouter><BrowserRouter> 的用法与 5.x 相同。

3. <Routes/> 与 <Route/>

  1. v6版本中移出了先前的<Switch>,引入了新的替代者:<Routes>

  2. <Routes><Route>要配合使用,且必须要用<Routes>包裹<Route>

  3. <Route> 相当于一个 if 语句,如果其路径与当前 URL 匹配,则呈现其对应的组件。

  4. <Route caseSensitive> 属性用于指定:匹配时是否区分大小写(默认为 false)。

  5. 当URL发生变化时,<Routes>都会查看其所有子<Route> 元素以找到最佳匹配并呈现组件 。

  6. <Route> 也可以嵌套使用,且可配合useRoutes()配置 “路由表” ,但需要通过 <Outlet> 组件来渲染其子路由。

  7. 示例代码:

<Routes> /*path属性用于定义路径,element属性用于定义当前路径所对应的组件*/ <Route path="/login" element={<Login />}></Route> /*用于定义嵌套路由,home是一级路由,对应的路径/home*/ <Route path="home" element={<Home />}> /*test1 和 test2 是二级路由,对应的路径是/home/test1 或 /home/test2*/ <Route path="test1" element={<Test/>}></Route> <Route path="test2" element={<Test2/>}></Route> </Route> //Route也可以不写element属性, 这时就是用于展示嵌套的路由 .所对应的路径是/users/xxx <Route path="users"> <Route path="xxx" element={<Demo />} /> </Route> </Routes>

4. <Link>

  1. 作用: 修改URL,且不发送网络请求(路由链接)。

  2. 注意: 外侧需要用<BrowserRouter><HashRouter>包裹。

  3. 示例代码:

import { Link } from "react-router-dom"; function Test() { return ( <div> <Link to="/路径">按钮</Link> </div> ); }

5. <NavLink>

  1. 作用: 与<Link>组件类似,且可实现导航的“高亮”效果。

  2. 示例代码:

// 注意: NavLink默认类名是active,下面是指定自定义的class //自定义样式 <NavLink to="login" className={({ isActive }) => { console.log('home', isActive) return isActive ? 'base one' : 'base' }} >login</NavLink> /* 默认情况下,当Home的子组件匹配成功,Home的导航也会高亮, 当NavLink上添加了end属性后,若Home的子组件匹配成功,则Home的导航没有高亮效果。 */ <NavLink to="home" end >home</NavLink>

6. <Navigate>

  1. 作用:只要<Navigate>组件被渲染,就会修改路径,切换视图。

  2. replace属性用于控制跳转模式(push 或 replace,默认是push)。

  3. 示例代码:

import React,{useState} from 'react' import {Navigate} from 'react-router-dom' export default function Home() { const [sum,setSum] = useState(1) return ( <div> <h3>我是Home的内容</h3> {/* 根据sum的值决定是否切换视图 */} {sum === 1 ? <h4>sum的值为{sum}</h4> : <Navigate to="/about" replace={true}/>} <button onClick={()=>setSum(2)}>点我将sum变为2</button> </div> ) }

7. <Outlet>

  1. <Route>产生嵌套时,渲染其对应的后续子路由。

  2. 示例代码:

//根据路由表生成对应的路由规则 const element = useRoutes([ { path:'/about', element:<About/> }, { path:'/home', element:<Home/>, children:[ { path:'news', element:<News/> }, { path:'message', element:<Message/>, } ] } ]) //Home.js import React from 'react' import {NavLink,Outlet} from 'react-router-dom' export default function Home() { return ( <div> <h2>Home组件内容</h2> <div> <ul className="nav nav-tabs"> <li> <NavLink className="list-group-item" to="news">News</NavLink> </li> <li> <NavLink className="list-group-item" to="message">Message</NavLink> </li> </ul> {/* 指定路由组件呈现的位置 */} <Outlet /> </div> </div> ) }

十一、Hooks 总结

1. useRoutes()

  1. 作用:根据路由表,动态创建<Routes><Route>

  2. 示例代码:

//路由表配置:src/routes/index.js import About from '../pages/About' import Home from '../pages/Home' import {Navigate} from 'react-router-dom' export default [ { path:'/about', element:<About/> }, { path:'/home', element:<Home/> }, { path:'/', element:<Navigate to="/about"/> } ] //App.jsx import React from 'react' import {NavLink,useRoutes} from 'react-router-dom' import routes from './routes' export default function App() { //根据路由表生成对应的路由规则 const element = useRoutes(routes) return ( <div> ...... {/* 注册路由 */} {element} ...... </div> ) }

2. useNavigate()

  1. 作用:返回一个函数用来实现编程式导航。

  2. 示例代码:

import React from 'react' import {useNavigate} from 'react-router-dom' export default function Demo() { const navigate = useNavigate() const handle = () => { //第一种使用方式:指定具体的路径 navigate('/login', { replace: false, state: {a:1, b:2} }) //第二种使用方式:传入数值进行前进或后退,类似于5.x中的 history.go()方法 navigate(-1) } return ( <div> <button onClick={handle}>按钮</button> </div> ) }

3. useParams()

  1. 作用:回当前匹配路由的params参数,类似于5.x中的match.params

  2. 示例代码:

import React from 'react'; import { Routes, Route, useParams } from 'react-router-dom'; import User from './pages/User.jsx' function ProfilePage() { // 获取URL中携带过来的params参数 let { id } = useParams(); } function App() { return ( <Routes> <Route path="users/:id" element={<User />}/> </Routes> ); }

4. useSearchParams()

  1. 作用:用于读取和修改当前位置的 URL 中的查询字符串。

  2. 返回一个包含两个值的数组,内容分别为:当前的seaech参数、更新search的函数。

  3. 示例代码:

import React from 'react' import {useSearchParams} from 'react-router-dom' export default function Detail() { const [search,setSearch] = useSearchParams() const id = search.get('id') const title = search.get('title') const content = search.get('content') return ( <ul> <li> <button onClick={()=>setSearch('id=008&title=哈哈&content=嘻嘻')}>点我更新一下收到的search参数</button> </li> <li>消息编号:{id}</li> <li>消息标题:{title}</li> <li>消息内容:{content}</li> </ul> ) }

5. useLocation()

  1. 作用:获取当前 location 信息,对标5.x中的路由组件的location属性。

  2. 示例代码:

import React from 'react' import {useLocation} from 'react-router-dom' export default function Detail() { const x = useLocation() console.log('@',x) // x就是location对象: /* { hash: "", key: "ah9nv6sz", pathname: "/login", search: "?name=zs&age=18", state: {a: 1, b: 2} } */ return ( <ul> <li>消息编号:{id}</li> <li>消息标题:{title}</li> <li>消息内容:{content}</li> </ul> ) }

6. useMatch()

  1. 作用:返回当前匹配信息,对标5.x中的路由组件的match属性。

  2. 示例代码:

<Route path="/login/:page/:pageSize" element={<Login />}/> <NavLink to="/login/1/10">登录</NavLink> export default function Login() { const match = useMatch('/login/:x/:y') console.log(match) //输出match对象 //match对象内容如下: /* { params: {x: '1', y: '10'} pathname: "/LoGin/1/10" pathnameBase: "/LoGin/1/10" pattern: { path: '/login/:x/:y', caseSensitive: false, end: false } } */ return ( <div> Login </div> ) }

7. useInRouterContext()

作用:如果组件在 <Router> 的上下文中呈现,则 useInRouterContext 钩子返回 true,否则返回 false。

import React from 'react' import { useInRouterContext } from 'react-router-dom' export default function About() { // 使用 useInRouterContext() hooks 检查当前组件是否处于路由的上下文环境 console.log('是否处于路由的上下文环境?', useInRouterContext()); return ( <div> <h3>我是 About 组件的内容</h3> </div> ) }

8. useNavigationType()

  1. 作用:返回当前的导航类型(用户是如何来到当前页面的)。
  2. 返回值:POPPUSHREPLACE
  3. 备注:POP是指在浏览器中直接打开了这个路由组件(刷新页面)。
import React from 'react' import { useNavigationType } from 'react-router-dom' export default function About() { // 调用 useNavigationType() hooks,可以获取当前路由是以那种跳转模式跳转过来的(PUSH、REPLACE) console.log(useNavigationType()); return ( <div> <h3>我是 About 组件的内容</h3> </div> ) }

9. useOutlet()

  1. 作用:用来呈现当前组件中渲染的嵌套路由。

  2. 示例代码:

const result = useOutlet() console.log(result) // 如果嵌套路由没有挂载,则result为null // 如果嵌套路由已经挂载,则展示嵌套的路由对象

10.useResolvedPath()

  1. 作用:给定一个 URL值,解析其中的:path、search、hash值。
import React from 'react' import { useResolvedPath } from 'react-router-dom' export default function News() { // 调用 useResolvedPath() hooks,传入 URL 会帮我们解析其中的:path、search、hash值 console.log(useResolvedPath('/user?id=001&name=coderbin&age=18')); return ( <div> <ul> <li>news001</li> <li>news002</li> <li>news003</li> </ul> </div> ) }
每文一句:学而不思则罔,思而不学则殆。

本次的分享就到这里,如果本章内容对你有所帮助的话可以点赞+收藏。文章有不对的地方欢迎指出,有任何疑问都可以在评论区留言。希望大家都能够有所收获,大家一起探讨、进步?!

有关React-Router6:从入门到实战最佳指南的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  5. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  6. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  7. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  8. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  9. ruby - 最佳原则中的原则 - 2

    我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的

  10. ruby-on-rails - 与 ActiveMerchant 一起使用的最佳支付网关是什么? - 2

    我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http

随机推荐