{count}
{userLlist.map((item)=>{return <li key={item.id}>{item.name}</li>}) }
key是用于react内部渲染处理的
{flag && <p>{"显示"}</p>}
function getItem(){
if(type==1) return <p>有图模式<p/>
else if(type==2) return <>无图</>
}
2、useState使用
state是状态变量,数据变化视图变化
const [userList,setUserList]=useState([{id:1,name:"z"}])
3.map,filter函数使用
4.tab切换功能实现
const tab={{type:" ",text:" "}}
//将type设为class高亮
import * as _ from 'lodash'
setCommentList(_.orderby(commentList,'star'//字段名,'desc'))
//不改变原数组
6.classnames优化类名控制
7.受控绑定表单
<input
value={value}
onChange={(e)=>{
setValue(e.target.value); //显示输入
}}
type='text'
/>
const inputRef=useRef(null);
<input ref={inputRef}/>
//使用inputRef.current获取DOM对象
9.uuid和dayjs库的使用
用于父传子组件消息
function Son(prop){
prop.name
prop.children //特殊属性
}
function Father(prop){
return <Son name="xxx"><p>this is span<p/></Son>
}
11.子传父,兄弟之间传消息(利用子传父,父传兄弟)
12.使用Context跨层通信
1、全局中createContext创建一个Context上下文对象
2、上层用<Context.Provider value={mdg}></>传递数据
3、底层用useContext(Context)方法获取数据
清除副作用,最常见是在组件卸载时候
14.自定义hook
15.hook使用规则
1.组件外使用 x
2.if,for循环内使用 x
16.json-server和axios使用
在我们继续之前,你需要熟悉一些重要的 Redux 术语:
完成购物车功能
store.js
// 编写store
import { createSlice } from "@reduxjs/toolkit"
import axios from "axios"
const foodsStore = createSlice({
name: 'foods',
initialState: {
// 商品列表
foodsList: [],
// 菜单激活下标值
activeIndex: 0,
// 购物车列表
cartList: []
},
reducers: {
// 更改商品列表
setFoodsList (state, action) {
// payload是传入的值
state.foodsList = action.payload
},
changeActiveIndex(state,action){
state.activeIndex = action.payload
},
addCart (state, action) {
// 是否添加过?以action.payload.id去cartList中匹配 匹配到了 添加过
const item = state.cartList.find(item => item.id === action.payload.id)
if (item) {
item.count++
} else {
state.cartList.push(action.payload)
}
},
// count增
increCount (state, action) {
// 关键点:找到当前要修改谁的count id
const item = state.cartList.find(item => item.id === action.payload.id)
item.count++
},
// count减
decreCount (state, action) {
// 关键点:找到当前要修改谁的count id
const item = state.cartList.find(item => item.id === action.payload.id)
if (item.count === 0) {
return
}
item.count--
},
clearCart(state){
state.cartList=[];
},
}
})
// 异步获取部分
const { setFoodsList, changeActiveIndex, addCart, increCount, decreCount, clearCart } = foodsStore.actions
const fetchFoodsList = () => {
return async (dispatch) => {
// 编写异步逻辑
const res = await axios.get('meituan/menu')
// 调用dispatch函数提交action
dispatch(setFoodsList(res.data))
}
}
export { fetchFoodsList, changeActiveIndex, addCart, increCount, decreCount, clearCart }
const reducer = foodsStore.reducer
export default reducer
const router = createBrowserRouter([
{
path:"login",
element:<DempPage/>
},
{
path:"index",
element:<DempPage/>
}
])
<Link to='/index' />
useNavigate()