使用React構建精簡版本掘金(一)
最近正在學習react,就想著能不能用react做一個專案,平時瀏覽掘金,就拿掘金練手吧!
是不是可以以假亂真呢!????????????
初始化
- 使用create-react-app初始化專案結構
yarn create react-app react-juejin
這個腳手架會自動幫助我們搭建基礎工程,同時安裝React專案的各種必要依賴,如果在過程中出現網路問題,請嘗試配置代理或使用其他 npm registry。
進入專案並啟動
cd react-juejin
yarn start
- 安裝ant-design
yarn add antd
- 配置UI庫懶載入樣式
需要對整個專案重新配置,這裡使用了(一個對 create-react-app 進行自定義配置的社群解決方案)。
yarn add react-app-rewired customize-cra
修改package.json 檔案如下
在根目錄中建立config-overrides.js,用於重寫覆蓋預設的配置
module.exports = function override(config, env) {
// do stuff with the webpack config...
return config;
};
- 使用 babel-plugin-import
該外掛用於按需載入plugins和樣式
yarn add babel-plugin-import
修改上步建立的config-overrides.js
const { override, fixBabelImports } = require('customize-cra');
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: 'css',
})
);
- 新增less-loader
個人習慣使用less,看個人喜好安裝即可,不過查閱上面社群方案react-app-rewired,並沒有提供比如sass的重寫方案,故如果需要使用sass,可採用別的方案引入。
yarn add less less-loader
修改config-overrides.js
//const { override, fixBabelImports } = require('customize-cra');
const { override, fixBabelImports, addLessLoader } = require('customize-cra');
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
}),
addLessLoader({
javascriptEnabled: true,
}),
);
以上詳細配置的話可參考
引入redux
- 安裝
yarn add redux react-redux --save
- 使用方式
考慮到之後可能會有多個reducer,開始就把結構弄好,做成日後可以方便合併使用多個reducer的方式
(1)建立一個reducer
// 建議使用這中結構
// 1.定義預設資料
let initialState = {
notificationCount: 0
}
// 2.Reducer
const pageHeaderReducer = (state = initialState, action) => {
switch (action.type) {
case 'CHANGE_COUNT':
return { ...state, notificationCount: action.notificationCount }
default:
return state
}
}
// 3.匯出
export default pageHeaderReducer;
(2)建立index.js,作為合併所有reducer的檔案。
import {combineReducers} from 'redux';
import pageHeaderReducer from './pageHeader.js';
const appReducer = combineReducers({
pageHeaderReducer
});
export default appReducer;
(3)App.js中使用定義好的reducer
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import appReducer from './reducers/index.js';
// 使用合併後的那個Reducer
const store = createStore(appReducer);
class App extends Component {
constructor(props){
super(props);
}
...
render() {
return (
<Provider store={store}>
<div className="App">
...
</div>
</Provider>
);
}
}
(4)在header/index.js中使用redux
import { connect } from 'react-redux';
class Header extends Component {
...
render() {
...
return (
<Affix offsetTop={this.state.top}>
...
<Badge count={this.props.count} overflowCount={10}>
<a href="/">
<Icon type="notification" />
</a>
</Badge>
</Affix>
);
}
}
const mapStateToProps = (state) => {
return {
count: state.pageHeaderReducer.notificationCount
}
}
Header=connect(mapStateToProps)(Header)
export default Header;
到目前為止,就可以在外部修改notificationCount的值,透過redux,元件內部就可以正常獲取到對應的count值。
更詳細的redux配置可以參考
新增路由react-router
首頁導航中存在5個tab切換,分別對應這不同的頁面內容。接下來介紹如何透過react-router實現不同頁面內容的跳轉。
- 安裝react-router
yarn add react-router-dom --save
- 使用方式
import { Switch, Route } from 'react-router-dom';
...
class Main extends Component {
constructor(props) {
super(props);
this.state = { }
}
render() {
return (
<div>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/timeline' component={Home}/>
<Route path='/dynamic' component={Dynamic}/>
<Route path='/topic' component={Topic}/>
<Route path='/brochure' component={Brochure}/>
<Route path='/activity' component={Activity}/>
</Switch>
</div>
);
}
}
上面的exact表示絕對匹配/,如果不註明exact,則/還會匹配/timeline等等上面程式碼實現了一個類似tabbar切換的效果
- tab導航
render() {
return (
<ul>
{this.state.navs.map((item,index)=>{
return <li key={item.path} className={item.isActived?'activeLi':''} onClick={this.handelClick.bind(this,index)}>
<Link to={item.path}>{item.text}</Link>
</li>
})}
</ul>
);
}
react-router中提供了Link和NavLik兩種方式,如果僅僅需要匹配路由,使用Link就可以了,而NavLink的不同在於可以給當前選中的路由新增樣式, 比如上面寫到的activeStyle和activeClassName
更詳細的react-router配置可以參考
到目前為止,基礎結構就算是完成了,後續的就需要往各個頁面新增實際內容了。
目前效果圖如上所示,後續不斷更新中。以上詳細程式碼見,歡迎點贊,您的點贊是我的動力。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4798/viewspace-2822321/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用React構建精簡版本掘金(二)React
- 使用React構建精簡版本掘金(四)React
- 使用React構建精簡版本掘金(三)React
- React Demo Three - 簡書&掘金React
- [譯] 使用 React 和 ImmutableJS 構建一個拖放佈局構建器ReactJS
- 一個簡單的構建React元件動畫方案React元件動畫
- 使用React構建簡單專案步驟(Mac 環境)ReactMac
- 使用 Python 構建一個簡單的 RESTful APIPythonRESTAPI
- 使用Vite快速構建前端React專案Vite前端React
- DvaJS構建配置React專案與使用JSReact
- 【譯】使用 MongoDB,React,Node 和 Express(MERN)構建一個全棧應用MongoDBReactExpress全棧
- 使用flex佈局構建一個iphone容器---基於react,styled-componentsFlexiPhoneReact
- 從零開始構建react應用(一)前言React
- IBM 使用 react 構建的開源設計系統IBMReact
- 使用JHipster構建Spring和React構建電子商務應用程式原始碼 -DEVSpringReact原始碼dev
- 構建自己的React UI元件庫: 構建首頁ReactUI元件
- 使用 PicoLisp 構建簡易文字識別程式Lisp
- 使用docker-compsoe構建一個簡單nginx+php環境DockerNginxPHP
- [譯] 使用 Node 和 OAuth 2.0 構建一個簡單的 REST APIOAuthRESTAPI
- 使用 create-react-app 構建 react應用程式流程及開發注意點ReactAPP
- 如何快速構建React元件庫React元件
- React構建個人部落格React
- 使用React,Vue和Single-spa構建微前端Micro FrontendsReactVue前端
- 簡單介紹如何使用Bazel構建Golang程式Golang
- 使用 Yarn workspace,TypeScript,esbuild,React 和 Express 構建 K8S 雲原生應用(一)YarnTypeScriptUIReactExpressK8S
- 記一次 React + Koa + Mysql 構建個人部落格ReactMySql
- 構建自己的React:(4)Components and StateReact
- 最精簡使用mORMot (二)ORM
- React 筆記 | React 的出現和構建思維React筆記
- 法治日報:超融合大幅簡化運維,構建精簡穩定的 IT 基礎設施運維
- LangGraph入門:構建ReACT架構的智慧AgentReact架構
- 快速開始構建一個簡單專案
- [轉]:如何快速構建一個簡單的程式
- 程式碼來構建一個簡單的compilerCompile
- 使用Java和Dapr構建雲原生應用簡介Java
- 嚐鮮用 React Hook + Parcel 構建真心話大冒險簡單頁面ReactHook
- react hooks 的簡單使用ReactHook
- React-Redux簡單使用ReactRedux