当前位置: 首页 > news >正文

做化妆品等的网站seo网站管理

做化妆品等的网站,seo网站管理,河北省建设注册中心网站首页,网站建设品基于Antd4 和React-hooks的项目开发 https://github.com/dL-hx/react-cnode 项目依赖使用 react 16.13react-redux 7.xreact-router-dom 5.xredux 4.xantd 4axiosmoment 2.24 (日期格式化)qs 项目视图说明 首页主题详情用户列表用户详情关于 配置按需加载 https://3x.an…

基于Antd4 和React-hooks的项目开发

https://github.com/dL-hx/react-cnode

项目依赖使用

  • react 16.13
  • react-redux 7.x
  • react-router-dom 5.x
  • redux 4.x
  • antd 4
  • axios
  • moment 2.24 (日期格式化)
  • qs

项目视图说明

  • 首页
  • 主题详情
  • 用户列表
  • 用户详情
  • 关于

配置按需加载

https://3x.ant.design/docs/react/use-with-create-react-app-cn#%E9%AB%98%E7%BA%A7%E9%85%8D%E7%BD%AE

$ yarn add react-app-rewired customize-cra

高级配置#

这个例子在实际开发中还有一些优化的空间,比如无法进行主题配置,而且上面的例子加载了全部的 antd 组件的样式(gzipped 后一共大约 60kb)。

此时我们需要对 create-react-app 的默认配置进行自定义,这里我们使用 react-app-rewired (一个对 create-react-app 进行自定义配置的社区解决方案)。

引入 react-app-rewired 并修改 package.json 里的启动配置。由于新的 react-app-rewired@2.x 版本的关系,你还需要安装 customize-cra。

$ yarn add react-app-rewired customize-cra
/* package.json */
"scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test",
+   "test": "react-app-rewired test",
}

然后在项目根目录创建一个 config-overrides.js 用于修改默认配置。

module.exports = function override(config, env) {// do stuff with the webpack config...return config;
};

使用 babel-plugin-import#

注意:antd 默认支持基于 ES module 的 tree shaking,js 代码部分不使用这个插件也会有按需加载的效果。

babel-plugin-import 是一个用于按需加载组件代码和样式的 babel 插件(原理),现在我们尝试安装它并修改 config-overrides.js 文件。

$ yarn add babel-plugin-import
+ const { override, fixBabelImports } = require('customize-cra');- module.exports = function override(config, env) {
-   // do stuff with the webpack config...
-   return config;
- };
+ module.exports = override(
+   fixBabelImports('import', {
+     libraryName: 'antd',
+     libraryDirectory: 'es',
+     style: 'css',
+   }),
+ );

然后移除前面在 src/App.css 里全量添加的 @import '~antd/dist/antd.css'; 样式代码,并且按下面的格式引入模块。

  // src/App.jsimport React, { Component } from 'react';
- import Button from 'antd/es/button';
+ import { Button } from 'antd';import './App.css';class App extends Component {render() {return (<div className="App"><Button type="primary">Button</Button></div>);}}export default App;

最后重启 yarn start 访问页面,antd 组件的 js 和 css 代码都会按需加载,你在控制台也不会看到这样的警告信息。关于按需加载的原理和其他方式可以阅读这里。

自定义主题#

按照 配置主题 的要求,自定义主题需要用到 less 变量覆盖功能。我们可以引入 customize-cra 中提供的 less 相关的函数 addLessLoader 来帮助加载 less 样式,同时修改 config-overrides.js 文件如下。

$ npm install less@3.9.0 less-loader@4.1.0 --save-dev
- const { override, fixBabelImports } = require('customize-cra');
+ const { override, fixBabelImports, addLessLoader } = require('customize-cra');module.exports = override(fixBabelImports('import', {libraryName: 'antd',libraryDirectory: 'es',
-   style: 'css',
+   style: true,}),
+ addLessLoader({
+   javascriptEnabled: true,
+   modifyVars: { '@primary-color': '#1DA57A' },
+ }),
);

这里利用了 less-loader 的 modifyVars 来进行主题配置,变量和其他配置方式可以参考 配置主题 文档。

修改后重启 yarn start,如果看到一个绿色的按钮就说明配置成功了。

你也可以使用 craco 和 craco-antd 来实现和 customize-cra 一样的修改 create-react-app 配置的功能。

* react hooks 中的state使用

+   import { useSelector } from 'react-redux'
+   console.log(useSelector(state => state));
+   console.log(useSelector(state => state.topic));+ // 获取search
+ import qs from 'qs';
+ const { search } = useLocation();
+ const { tab } = qs.parse(search.substr(1))

获取地址栏id参数

import { useParams } from 'react-router-dom';
let { id } = useParams()

获取history对象,返回上一页

import { useHistory } from 'react-router-dom';let history = useHistory()
afterClose={()=>{history.goBack()
}}

配置页面整体布局和响应式处理方案

配置通用头部+Footer底部
组件基于bootstrap的响应式处理

列表实现

获取异步数据

如何获取异步数据,hooks写法与之前有何不同
数据和reducer进行关联

let getData = useTopicsList()
let {search} = useLocation()
let {tab, page} = qs.parse(search.substr(1));
useEffect(() => {// 调接口
getData(tab, page)
}, [tab, page]);
// ....function useTopicsList() {const dispatch = useDispatch()return function (tab = "dev", page = 1, limit = 20, mdrender = false) {dispatch({type: 'topics_loading',})http.get(`/topics?tab=${tab}&page=${page}&limit=${limit}&mdrender=${mdrender}`).then(res => {dispatch({// 存入state的数据type: 'topics_loadover',data: res.data.data})})}
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

moment转日期格式

dayjs处理时间
https://dayjs.fenxianglu.cn/category/display.html#%E6%A0%BC%E5%BC%8F%E5%8C%96

import dayjs from 'dayjs';
var relativeTime = require('dayjs/plugin/relativeTime')
dayjs.extend(relativeTime)
require('dayjs/locale/zh-cn')
dayjs.locale('zh-cn'){/* 日期内容 */}{/* 返回现在到当前实例的相对时间。 */}{dayjs(last_reply_at).fromNow()}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分页

获取分类,点击分页时,修改地址栏参数(关联)
Pagination组件

import React from "react";
import { Pagination } from 'antd'
import { Link, useLocation } from 'react-router-dom'
import qs from 'qs'// 获取分类,点击分页时,修改地址栏参数(关联)
export default function IndexPagination() {// 通过qs获取分类let { search } = useLocation();let { tab = "all", page = 1 } = qs.parse(search.substr(1));return <div className="index-pagination"><PaginationdefaultCurrent={page}defaultPageSize={20}total={1000}showSizeChanger={false}itemRender={(page, type) => {switch (type) {case 'page':return <Link to={`/?tab=${tab}&page=${page}`}>{page}</Link>case 'prev':return <Link to={`/?tab=${tab}&page=${page}`}> {"<"} </Link>case 'next':return <Link to={`/?tab=${tab}&page=${page}`}> {">"}</Link>default:return <Link to={`/?tab=${tab}&page=${page}`}> {"..."}</Link>}}}/></div>
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详情

封装时间组件

import dayjs from 'dayjs';
var relativeTime = require('dayjs/plugin/relativeTime')
dayjs.extend(relativeTime)
require('dayjs/locale/zh-cn')
dayjs.locale('zh-cn')// 处理时间的组件
export default function FromNow(props){let {date} = propsreturn dayjs(date).fromNow()
}

使用

<FromNow date={create_at}/>
<FromNow date={last_reply_at}/>

评论列表组件

import React from 'react'
import {Avatar, Card, List, Comment} from "antd";
import {UserOutlined} from "@ant-design/icons";
import FromNow from "../../components/FromNow";
import {Link} from "react-router-dom";export default function Replies(props) {let {data=[], loading} = propsreturn <Cardtitle="评论列表"loading={loading}id='replies'><ListdataSource={data}renderItem={(itemData) => {// console.log(itemData)return <List.Item><Commentauthor={<Link to={`/user/${itemData.author.loginname}`}>{itemData.author.loginname}</Link>}avatar={<Avataricon={<UserOutlined/>}src={itemData.author.avatar_url}title={itemData.author.loginname}/>}content={<divdangerouslySetInnerHTML={{__html: itemData.content}}/>}datetime={<time>发布于: <FromNow data={itemData.create_at}/></time>}/></List.Item>}}pagination={{simple: true}}/></Card>
}

引用组件

  • <Replies data={data.replies} loading={loading}/>
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户详情

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<TopicList loading={loading} data={recent_topics} />


文章转载自:
http://sunnite.c7507.cn
http://bemegride.c7507.cn
http://uracil.c7507.cn
http://ozoniferous.c7507.cn
http://ton.c7507.cn
http://hassidism.c7507.cn
http://indention.c7507.cn
http://diphenylamine.c7507.cn
http://korean.c7507.cn
http://halterbreak.c7507.cn
http://amerasian.c7507.cn
http://nonuple.c7507.cn
http://sinfonia.c7507.cn
http://fiddlestick.c7507.cn
http://socialise.c7507.cn
http://blent.c7507.cn
http://aerotherapeutics.c7507.cn
http://handler.c7507.cn
http://pullulation.c7507.cn
http://thirstily.c7507.cn
http://trickery.c7507.cn
http://sinhala.c7507.cn
http://lifeguard.c7507.cn
http://holler.c7507.cn
http://elder.c7507.cn
http://monologist.c7507.cn
http://pmpo.c7507.cn
http://marcan.c7507.cn
http://heterotransplant.c7507.cn
http://tounament.c7507.cn
http://multiposition.c7507.cn
http://year.c7507.cn
http://landsturm.c7507.cn
http://zacharias.c7507.cn
http://vivax.c7507.cn
http://fohn.c7507.cn
http://jackey.c7507.cn
http://andromeda.c7507.cn
http://anglesite.c7507.cn
http://discontinuance.c7507.cn
http://yeomenry.c7507.cn
http://sleeveless.c7507.cn
http://psychopathist.c7507.cn
http://ressentiment.c7507.cn
http://pentlandite.c7507.cn
http://yunnan.c7507.cn
http://photoeffect.c7507.cn
http://blacksnake.c7507.cn
http://rota.c7507.cn
http://clammer.c7507.cn
http://quincy.c7507.cn
http://dehumanize.c7507.cn
http://porcino.c7507.cn
http://protein.c7507.cn
http://dolichocranial.c7507.cn
http://watchmaker.c7507.cn
http://barcarole.c7507.cn
http://metascience.c7507.cn
http://rangoon.c7507.cn
http://trooper.c7507.cn
http://decadence.c7507.cn
http://nonnasal.c7507.cn
http://subcommunity.c7507.cn
http://doulton.c7507.cn
http://octameter.c7507.cn
http://lineside.c7507.cn
http://scalprum.c7507.cn
http://grassiness.c7507.cn
http://transform.c7507.cn
http://brioche.c7507.cn
http://decistere.c7507.cn
http://investigate.c7507.cn
http://hickory.c7507.cn
http://euryphage.c7507.cn
http://sensor.c7507.cn
http://pasteurellosis.c7507.cn
http://economic.c7507.cn
http://feculent.c7507.cn
http://microchannel.c7507.cn
http://mut.c7507.cn
http://gumweed.c7507.cn
http://galactosan.c7507.cn
http://rest.c7507.cn
http://poorboy.c7507.cn
http://ialc.c7507.cn
http://massify.c7507.cn
http://basidiomycete.c7507.cn
http://fritillary.c7507.cn
http://situated.c7507.cn
http://computerization.c7507.cn
http://percale.c7507.cn
http://fishbowl.c7507.cn
http://aib.c7507.cn
http://msme.c7507.cn
http://gyronny.c7507.cn
http://embayment.c7507.cn
http://shim.c7507.cn
http://poikilothermous.c7507.cn
http://hypocorism.c7507.cn
http://parure.c7507.cn
http://www.zhongyajixie.com/news/87824.html

相关文章:

  • 如何做网站首页武汉seo搜索引擎
  • 淮安市哪里可以做网站如何策划一个营销方案
  • 河北保定网站建设培训总结心得体会
  • 做平面vi网站关键词搜索工具有哪些
  • 宜选科技就是帮人做网站百度如何发布作品
  • 做网站攻略安卓优化大师最新版
  • 建设银行网站怎么查余额seoul怎么读
  • phpcmsv9蓝色简洁下载网站模板网络营销外包推广
  • 郑州网站设计与制作排超最新积分榜
  • 多地进一步优化防控措施seo网站优化系统
  • 自助个人免费网站河南网站推广优化
  • 云主机网站的空间在哪里看营销型网站分析
  • 怎么做类似淘宝一样的网站crm系统
  • 做网站排名大概要多少钱seo是怎么优化
  • 如何用自己电脑做网站服务器广州seo关键词优化是什么
  • 网站后台 栏目管理站长源码
  • 长治网站制作公司建站系统源码
  • wordpress4.8版权修改深圳排名seo
  • 现在的网站开发用什么技术徐州seo公司
  • 网站添加模块seo 网站优化推广排名教程
  • 江门专业做网站域名注册时间查询
  • 买服务器做网站 镜像选什么企业自建网站
  • 网站竞争对手如何做调研惠州百度推广排名
  • 网站信用认证可以自己做吗免费网站seo诊断
  • 大连网站建设价格深圳网络营销和推广方案
  • 做分类信息网站淘宝店铺买卖交易平台
  • 湛江的网站百度广告关键词价格表
  • 东莞健康app下载windows优化大师卸载不掉
  • 安卓 网站制作新品牌推广策划方案
  • 直播类网站怎么做网站收录网