状态:每一次状态的改变都会影响到整一个组件,包括子组件,比如说在代码的最后面修改了状态,在前面用到这个状态的逻辑也会执行一遍(实际上是每次状态改变都会从头“执行”一遍我们的代码)
state初始化:
使用useState进行初始化。
形式如下:const [yourState,setYourState]=useState(‘’)
yourState是你自己的state的名字,setYourState是用于改变state的,useState括号里面是state的初始值
改变state的值:state的值是不可以用普通方式改变的,改变state的值只能通过声明state时候的setYourState
具体实例:
import React,{ useState } from 'react'
// state初始化
const [allFrames,setAllFrames]=useState(1);
const [file,setFile]=useState(null);
const [isModalVisible, setIsModalVisible] = useState(false);
// 改变state
setFile(file);
setAllFrames(allFrames + 1);
// 父组件文件
import React from 'react';
export default function AlExe() {
return (
<MySelect option={['true','false']}/>
)
}
// 子组件文件
import { Select } from 'antd';
import React from 'react';
// props可以在子组件中直接获取直接使用 但是要先在函数的参数位置放上去
export default function MySelect(props) {
console.log('props ->',props);
return (
<div>MySelect</div>
)
}
import React,{ useEffect,useState } from 'react';
export default function Test() {
const [count,setCount]=useState(0);
function handleClick(){
setCount(count + 1);
}
useEffect(() => {
console.log('[count]被调用了');
}, [count])
useEffect(() => {
console.log('[]被调用了');
}, [])
return (
<div onClick={handleClick}>Test</div>
)
}
function handleBlur(e){
console.log(e.target.value);
}
// 涉及到函数的闭包 还有点模糊
// 调用箭头函数 传参Event给箭头函数 Event再传给handleBlur并返回handleBlur的调用
<input onBlur=((Event)=>{handleBlur(Event)}>
// 函数声明
function handleDetail(value){
console.log(value);
}
// 这两个不能直接用的哈 只是演示一下这样的传参方式
{
arr.map(i => {
return ({
// 使用箭头函数传参 调用箭头函数 返回一个函数的调用
// 这里的参数是直接传给handleDtail函数的
<a onClick={() => handleDetail(i)}>详细信息</a>
})
});
}
$ npm i-g create-react-app
$ create-react-app hello-react
$ npm start
$ npm run build
$ npm i react-router-dom
import React from 'react';
import { useRoutes } from 'react-router-dom'
import routes from './routes'
import Head from './component/head';
export default function App() {
const element = useRoutes(routes);
return (
<div>
<Head />
{element}
</div>
)
}
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import { HashRouter } from 'react-router-dom';
root.render(
<React.StrictMode>
<HashRouter><App /></HashRouter>
</React.StrictMode>
);
import React from 'react'
import { Navigate } from 'react-router-dom'
import Dlzc from '../pages/logandreg'
import Adminl from '../component/adminl'
import Register from '../component/register'
import ManageUser from '../pages/manageUser'
const routes = [
{
// 以及路由的路径是带'/'的 意义是‘当前路径下’?
path: '/dlzc',
element: <Dlzc />,
children: [
// 二级路由(嵌套路由)是不带'/'的 意义是'从头开始查找'?
{
path: 'namel',
element:<Namel/>,
},
{
path: 'register',
element:<Register/>
},
{
path: '',
element: <Navigate to='namel' />
}
]
},
{
path: '/manageUser',
element: <ManageUser />,
},
// 这样做的意义是默认导向 Navigate用于重定向
{
path: '',
element: <Navigate to='ManageUser'>
}
]
export default routes
import React from 'react'
// 导出Outlet
import { Outlet } from 'react-router-dom'
export default function Dlzc() {
return (
<div>
<Outlet />
</div>
)
}
<NavLink to='namel'>用户登录</NavLink>
<Link to='register'>用户注册</Link>
// LogPack文件夹中的index.jsx
import React from 'react'
// 1. 导出useNavigate
import { useNavigate } from 'react-router-dom';
export default function LogPack() {
// 2. 定义navigate
const navigate = useNavigate();
const data=[{name:'kkt',age:18},{name:'xiaoming',age:18}];
function handleDetail() {
// 使用navigate进行重定向 state用于传递参数
navigate('/logdetail', { state: data});
}
return (
// 点击这个链接 调用了handleDetail函数 重定向至另一个组件(将当前组件换成了另一个组件)
// 组件的放置的位置仍然是{element}
<a onClick={handleDetail}>详细信息</a>
)
}
// LogDetail文件夹中的index.jsx
import React from 'react'
// 1. 导入useLocation
import { useLocation } from 'react-router-dom'
export default function LogDetail() {
// 2. useLocation().state就是传过来的数据 state是键
console.log(useLocation().state);
return (
<div>logDetail</div>
)
}