React学习笔记(4.0)

57 篇文章 0 订阅
5 篇文章 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的State
    initialState: {
        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",
    //数据状态State
    initialState: {
        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.reducer

export 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生成之后才可用--useRef

const inputRef=useRef<HTMLInputElement>(null)
const showDom=()=>{
  console.log(inputRef.current);
  console.log(inputRef.current?.value);
  
}
//获取foodsList渲染数据列表
//useSelector
  return (
    <>
    <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页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值