React学习笔记(1)
请关注 sui 前端共学营及其社区,在这里你可以学到前端和 move 合约语言的知识。
npx create-react-app
后面跟上项目名字 我这里使用的是后者,创建完进入项目便可以使用npm start
启动项目。源码在src
目录下,public
是一些静态页面资源。src
下现在较为重要的文件有两个。一个是index.js
这里面引入了两关键库react
和react-dom
,后面通过react-dom
的createRoot
方法创建了ReactDomRoot
实例,在下面用render
进行跟组件渲染。React.StrictMode
能先粗理解为排的,可以帮助我们进行组件内部功能审查。
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
reportWebVitals();
另一个便是跟组件App.js
导入默认后缀是.js
所以上面导入没有后缀.js
是可行的。进入到App.js
有一个简单的函数App()
最后用exprot default App
导出。所以react的组件便是一个函数形式,react组件一般是函数形式和类形式组件,函数组件对比类组件较简约简单,所以一般使用函数形式组件。
在react中直接将HTML和JS书写在一起,这种语法就叫JSX。
在return
后面单行HTML可以不加小括号,多行换行的话不加小括号是无法展示的,需要return
后添加小括号再往里放HTML。建议两种情况都添加小括号。
JSX只能返回一个跟元素,不能有一跟元素的情况下再有一同级元素否则编译不成功。可以使用空标签作为根元素再将内容写入。 如以下形式:
return (
<>
<div>
</div>
<div>
</div>
</>
);
使用HTML标签要正确闭合,无论单标签亦是多标签都需要闭合。在index.js
有例子:
<React.StrictMode>
<App />
</React.StrictMode>
若是希望呈现结果不是写死的,而是变量的话就可以通过大括号插值方式来呈现。插值不仅可以在标签内容中使用,还可以作用在标签属性。使用插值时只有大括号不加引号。
function App() {
const divContent = "content";
const divTitle = "title"
return (
<div title = {divTitle}>
{divContent}
</div>
);
}
我们希望通过一个值是false或true来控制内容显示,真为span标签假为p标签, 注意这里修改内容不用像传统那样需要写成字符串。
function App() {
const divTitle = "title"
const flag = true;
if (flag) {
divContent = <span>true</span>;
} else {
divContent = <p>false</p>;
}
return (
<div>
{divContent}
</div>
);
}
为了根据一组数据进行渲染操作,现在有一个ul标签希望在其内部进行一组数据生成。可以使用map
方式遍历数据返回它。注意需要给其加个key
属性,虽然内容可以正常显示但是在控制台会有报红,我这里是加id
作为标识。
function App() {
const list = [
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" },
{ id: 3, name: "Cindy" }
]
const listContent = list.map(item => (
<li key={item.id}>{item.name}</li>
))
return (
<ul>{listContent}</ul>
);
}
若是希望在每个li下面加类似分割线效果循环的话,可以使用react提供的Fragment标签,key
从在li这改为在Fragment标签中。
const listContent = list.map(item => (
<Fragment key={item.id}>
<li>{item.name}</li>
<li>-------------------------</li>
</Fragment>
))
比如有一个button可以使用onCLick
方式设置事件,要是需要修改一个div中的内容使用传统的方式修改是无法是页面发生变化的。我们需要使用react提供的函数useState
。使用方法如下:
import { useState } from'react';
function App() {
const [content, setContent] = useState("默认");
function handleClick() {
setContent("点击了按钮");
}
return (
<>
<button onClick={handleClick}>按钮</button>
<div>{content}</div>
</>
);
}
接下来将演示useState
对象操作的方法,useState
是直接将你传入的值替换到原来的值。要是原来对象有一个title
值和content
值要是只改title
的话content
会失去。
可以写全或者使用以下方式:
function App() {
const [data, setData] = useState({
title: "默认",
content: "默认"
});
function handleClick() {
setData({
...data,
title: "新标题"
});
}
return (
<>
<button onClick={handleClick}>按钮</button>
<div title={data.title}>{data.content}</div>
</>
);
}
(新改的值放...data
后面)
若要循环展示数组对象内容与列表渲染相同加个key
,map
遍历返回li。要是相对内容做变更如:
添加数据在尾
function App() {
const [data, setData] = useState([
{ id: 1, name: "Alice"},
{ id: 2, name: "Bob"},
{ id: 3, name: "Cindy"}
]);
const listData = data.map(item => <li key={item.id}>{item.name}</li>);
function handleClick() {
setData([
...data,
{id: 4, name: "David"}
]);
}
return (
<>
<ul>{listData}</ul>
<button onClick={handleClick}>button</button>
</>
);
}
添加数据在头
function App() {
const [data, setData] = useState([
{ id: 1, name: "Alice"},
{ id: 2, name: "Bob"},
{ id: 3, name: "Cindy"}
]);
const listData = data.map(item => <li key={item.id}>{item.name}</li>);
function handleClick() {
setData([
{id: 4, name: "David"},
...data
]);
}
return (
<>
<ul>{listData}</ul>
<button onClick={handleClick}>button</button>
</>
);
}
不显示某数据(以不显示id=2
的为例子)
function App() {
const [data, setData] = useState([
{ id: 1, name: "Alice"},
{ id: 2, name: "Bob"},
{ id: 3, name: "Cindy"}
]);
const listData = data.map(item => <li key={item.id}>{item.name}</li>);
function handleClick() {
setData(
data.filter(item => item.id !== 2)
);
}
return (
<>
<ul>{listData}</ul>
<button onClick={handleClick}>button</button>
</>
);
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!