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

React学习笔记(4.0)

json-server实现数据Mock

1.项目中安装json-server

npm i -D json-server

2.准备一个json文件

3.添加启动命令【package.json中配置】

"server":"json-server ./server/data.json --port 8888"

该命令中,路径就是自己创建的json文件路径,端口也可以自定义,不要写默认其他服务的保留端口即可。

4.进行接口访问

 

 React使用redux

React使用redux,官方要求安装两个插件--Redux Toolkit 和react-redux

命令如下:

npm i @reduxjs/toolkit react-redux

在项目中,一般都放在store文件夹中,对应的模块放入modules文件夹里,对应的目录结构如下

index.tsx文件内容

import {configureStore} from "@reduxjs/toolkit"
import counterReducer from "./modules/counterStore"
import channelReducer from "./modules/channelStore"
import foodsReducer from "./modules/takeaway"
const store=configureStore({reducer: {counter:counterReducer,channel:channelReducer,foods:foodsReducer},})export default store

 然后再对应的modules文件夹里书写具体配置内容

以counterStore举例

//第一步:调用@reduxjs/tookit的createSlice方法
import {createSlice} from '@reduxjs/tookit'const counterStore=createSlice({
//给仓库起的名字name: 'counter',
//就是状态,类似与vux和pinia的StateinitialState: {count2:0},
//同步方法的书写都在这里//编写修改数据的方法 同步方法,支持直接修改reducers: {increment(state:any) {return state.count2 + 1;},decrement(state:any) {return state.count2 - 1;},addToNum(state:any,action:any){state.count=action.payload}}
})//结构出来actionCreater函数
const { increment,decrement,addToNum}=counterStore.actions
//获取reducer
const reducer=counterStore.reducer//导出对应的方法
export{ increment,decrement,addToNum}
//已默认导出的方式导出export default reducer;

这里只有同步的代码,如果有异步的代码,需要借助dispatch()方法,

带有异步方法的channelStore

import {createSlice} from "@reduxjs/toolkit"const channelStore=createSlice({name: "channel",//数据状态StateinitialState: {channelList: []},reducers: {//同步修改方法setChannels(state:any, action:any) {state.channelList = action.payload}}
})//结构出actionCreater函数
const {setChannels}=channelStore.actions
//异步请求部分
const fetchChannelList=()=>{return async(dispatch:any)=>{const res=await axios.get('http://localhost:8080')dispatch(setChannels(res.data.data.channels))}
}export {fetchChannelList}const reducer=channelStore.reducerexport default reducer

此时还需要再主文件中进行注册,才能使用

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
import {Provider} from 'react-redux'
import store from './store/index.tsx'
// import './index.css'createRoot(document.getElementById('root')!).render(<StrictMode><Provider store={store}><App /></Provider></StrictMode>,
)

来到组件中使用

import {useSelector,useDispatch} from 'react-redux'
//导入actionCreater
import {increment,decrement,addToNum} from './store/modules/counterStore'
import {fetchChannelList} from './store/modules/channelStore'const App = () => {const {count2}=useSelector((state:any)=>state.counter)const {channelList}=useSelector((state:any)=>state.channel)const dispatch=useDispatch()//使用useEffect触发异步请求执行useEffect(()=>{dispatch(fetchChannelList())},[dispatch])let list=['1','2','3'];// for(let i=0;i<list.length;i++){//   list[i]=<li>{list[i]}</li>// }const myClass = ['box1', 'box2']const myClass2 = classNames({box1:true,box2:true,[style.box5]:true})//useState实现一个计数器按钮const [count,setCount] = React.useState(0)const handleClick4=()=>{setCount(count+1)console.log('click',count);}const [form ,setForm]=useState({name:'mez',age:18})const handleClick5=()=>{setForm({...form,name:'jack'})}// 1.声明一个React状态const [value,setValue]=useState('')//2.核心绑定流程//①通过value属性绑定React状态//②绑定onChange事件,通过事件参数e拿到输入框最新的值,反向修改到React状态
// const setValue=()=>{// }//dom生成之后才可用--useRefconst inputRef=useRef<HTMLInputElement>(null)
const showDom=()=>{console.log(inputRef.current);console.log(inputRef.current?.value);}
//获取foodsList渲染数据列表
//useSelectorreturn (<><div><div className={myClass.join(' ')}>App</div><div style={{color:"purple",fontWeight:900}}>App2</div><div className={myClass2}> hello world!</div><button onClick={handleClick}>click me</button><button onClick={handleClick2(123)}>click me2</button><button onClick={(e)=>handleClick3(456,e)}>click me3</button><input type="text" onChange={(e)=>handleChange(e,'jack')} placeholder='请输入内容' />{list.map((item,index) => <li key={index}>{item}</li>)}<Button></Button><button onClick={handleClick4}>加一</button><button onClick={handleClick5}>修改对象</button><div>{count}--{form.name}</div><div className={classNames('box3',{box2:1===1})}>我是使用classnames的文本</div>{/* <input type="text" value={value}onChange={(e)=>setValue(e.target.value)}ref={inputRef}/> */}<input type="text" value={value}onChange={(e)=>setValue(e.target.value)}ref={inputRef}/><button onClick={showDom}>获取dom</button></div><div>{count2}</div><button onClick={()=>dispatch(decrement())}>-</button><button onClick={()=>dispatch(increment())}>+</button><button onClick={()=>dispatch(addToNum(10))}>add to 10</button><ul>{channelList.map((item:any)=><li key={item.id}>{item.name}</li>)}</ul></>)
}export default App

汇总

 

使用CRA初始化项目环境

npx create-react-app projectName

 运行项目:npm run start【不同的构建工具使用的命令也有所不同,具体可以看到package.json对应的脚本启动命令】

 

 常用的目录结构及其作用

 

 使用gitee管理项目

1.在gitee上初始化一个空项目仓库

按照它的提示进行仓库初始化

  

2.把远程仓库与本地仓库关联

这时候会有一个认证,需要验证你的gitee用户名和密码,输入正确就可以,要是输入错误下一次还是走这个错误的认证,需要在本机去删除那个认证标识,具体方法可以度娘。【最好还是一次成功,这样省去麻烦】 

3.提交代码到远程仓库

然后我们将自己创建的文件copy到这个初始化的文件夹中就行,默认刚才哪些代码就生成了一个MD文件,其他啥都没有

下面就是git命令了

git add .

 git commit -m "内容"

 git push -u origin "master"  提交到master分支

来到gitee页面


http://www.mrgr.cn/news/39963.html

相关文章:

  • Java项目实战II基于Java+Spring Boot+MySQL的免税商品优选购物商城(源码+数据库+文档)
  • vector中push_back和emplace_back的区别
  • 可扩展架构模式
  • 拿下奇怪的前端报错:某些多摄手机拉取部分摄像头视频流会导致应用崩溃
  • xtu oj 六边形
  • N诺计算机考研-错题(DS)
  • 银河麒麟系统镜像安装包下载
  • Node.JS 版本管理工具 Fnm 安装及配置(Windows)
  • 国内ChatGPT镜像网站整理汇总【OpenAI o1/GPT 4o】-2024/10月最新
  • MultipartFile 接口
  • 从一到无穷大 #36 Lindorm 宽表:东西互联,南北互联,AI一体
  • 优选驾考系统小程序的设计
  • 香港科技大学新作:速度场如何在复杂城市场景规划中大显身手
  • MySQL那些事(InnoDB架构和存储结构)
  • 怎样才能设计出全面且详细的测试要点?
  • Ollama安装部署CodeGeeX4 - ALL - 9B
  • AI写作赋能数据采集,开启无限可能性
  • Linux系统应用(6)——make与makefile
  • Electrodoc 5.2 专业电工工具集合,支持多种计算器和资料查询!
  • 平安养老险深圳分公司积极开展“金融教育宣传月”活动,展现金融为民新风尚