react笔记——(1)核心语法
1.文件组成
node_modules: 包
public:静态文件
src:主要文件
index.js:主引导文件(入口)
App.js:根组件
1 2 3 4 5
| <React.StrictMode> :用于纠错 例子: <React.StrictMode> <App /> </React.StrictMode>
|
2.Jsx书写方式
2.1 jsx格式:js + html
1 2 3 4 5 6 7 8
| function App() { return ( <div className="App"> 。。。 </div> ); }
|
2.2 jsx知识点
2.2.1.无论单标签还是多标签必须闭合
单标签:<App.js />
多标签:
2.2.2.jsx只能返回一个根元素
1 2 3 4 5 6 7 8 9 10 11
| 例子: function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> </header> </div> <div></div> ); }
|
解决方法(不希望有外部父级):
1.将div包含在另一个div中
2.使用空标签(<></>)(渲染时不会产生多余的内容)
1 2 3 4 5 6 7 8 9 10 11 12
| function App() { return ( <> <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> </header> </div> <div></div>//这个div就不能正常返回,会报错 </> ); }
|
2.2.3.使用双标签Fragment
1 2 3 4 5 6 7 8
| import {Fragment} from "react";
const listContent = list.map(item => ( <Fragment key={item.id}> <li key="item.id">{item.name}</li> <li>------------------</li> </Fragment> ))
|
3.插值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function App() { const divContent = '标签内容' const divTitle = '标签标题' return ( <div title={divTitle}>{divContent}</div> ); } 插值可以使用的位置: 1.标签内容 2.标签属性
function App() { const divTitle = '标签标题'
const flag = false let divContent = null if(flag) { divContent = <span>flag为true</span> } else { divContent = <p>flag为false</p> } return ( <div title={divTitle}>{divContent}</div> ); }
|
4.事件操作
1 2 3 4 5 6 7 8
| function handClick (e) { console.log("点击了按钮",e) }
return ( <button onClick={handClick}>按钮</button> )
|
5.useState状态处理
Vue中可以声明一种响应式数据,响应式数据能驱动页面进行更新(用来减少操作的一种手段)
react中,函数式组件默认没有这种状态机制。
1 2 3 4 5 6 7 8 9 10 11 12
| let divContent = '默认内容' function handClick (e) { divContent = '新内容' }
return ( <> <div>{divContent}</div> <button onClick={handClick}>按钮</button> </>
|
所以要使用react提供的函数:useState(状态初始值)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
import {useState} from "react"; const [content, setContent] = useState('标签的默认内容')
function handClick () { setContent('新内容') }
return ( <> <div>{content}</div> <button onClick={handClick}>按钮</button> </> )
|
5.1 对象形式的状态(或数组结构)
5.1.1 对象形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const [data, setDate] = useState({ title: '标题', content: '默认内容' })
function handClick () {
setDate({ title: '新标题', content: '默认内容' }) }
return ( <> <div title={data.title}>{data.content}</div> <button onClick={handClick}>按钮</button> </> )
|
当内容太多时就会很麻烦,所以可以使用展开操作:
1 2 3 4 5 6 7 8
|
function handClick (e) { setDate({ ...data, title: '新标题', }) }
|
5.1.2 数组操作
5.1.2.1 增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
const [data, setDate] = useState([ {id:1,name:'内容1'}, {id:2,name:'内容2'}, {id:3,name:'内容3'}, ])
const listData = data.map(item=>( <li key={item.id}>{item.name}</li> ))
let id = 3 function handClick () { setDate([ ...data, {id: ++id, name: '内容4'} ]) }
return ( <> <ul>{listData}</ul> <button onClick={handClick}>按钮</button> </> )
|
5.1.2.2 删除(使用filter进行过滤)
1 2 3 4 5 6 7 8
|
function handClick () { setDate(data.filter(item => item.id !==2)) }
|