赞
踩
无比流畅的React入门教程TOC
声明式设计 −为你应用的每一个状态设计简洁的视图,当数据改变时 React 能有效地更新并正确地渲染组件。
模块
组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<!-- React 核心库、 -->
<script src="lib/react/react.development.js"></script>
<!-- 操作 DOM 的 react 扩展库、 -->
<script src="lib/react/react-dom.development.js"></script>
<!-- 将 jsx 转为 js 的 babel 库 -->
<script src="lib/babel.min.js"></script>
</head>
<body>
<!-- 创建react解析的容器 -->
<div id="xiaojin"></div>
<script type="text/babel">
var msg = "I am xiaojin!!!";
//1.创建虚拟DOM
const VDOM = (
/* 此处一定不要写引号,因为不是字符串 */
<h1 id="title">
<span>Hello,{msg}</span>
</h1>
);
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM, document.getElementById("xiaojin"));
</script>
</body>
</html>
ReactDOM.render(
<div>
{/*注释...*/}
</div>,
document.getElementById('XXX')
);
var arr = [
<h1>A</h1>,
<h1>B</h1>,
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('XXX')
);
组件使用注意事项:
组件名必须是首字母大写
虚拟DOM元素只能有一个根元素
虚拟DOM元素必须有结束标签
< />
函数式组件
// 创建函数,返回一个虚拟DOM
function Test(props) {
return <h1>Hello, {props.name}</h1>;
}
// 渲染
ReactDOM.Render(<Test name = "xiaojin" />,document.getElementById("div"));
class形式,这个提一下,后面就不再举例啦,之后都用函数式
<div id="root"></div>
<script type="text/babel">
var msg = 'hello,world!';
// class形式
class HelloWorld extends React.Component {
render(){
console.log('this',this);
return (
<div>{msg}</div>
)
}
}
ReactDOM.render(<HelloWorld />,document.getElementById('root'));
state
通俗理解:state就是组件的一些数据绑定,数据变了,页面就会变,这是我的理解哦
注意事项
关于this
undefined
如何解决this
指向props
理解
作用
使用:
<script type="text/babel">
function Person(props) {
const { name, age, sex } = propsreturn(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age}</li>
</ul>
);
}
Person.propTypes = {
name: PropTypes.string.isRequired,
// 限制name必传,且为字符串sex:PropTypes.string, 限制sex为字符串age:PropTypes.number, 限制age为数值
};
// 标签属性值
Person.defaultProps = {
sex: "女",
age: 18,
};
ReactDOM.render(<Person name="XIAOJIN" />, document.getElementById("root"));
</script>
refs
组件内的标签可以定义ref属性来标识自己
有三种操作refs
的方法,分别为:
this.input1
来使用
createRef
形式<input ref={this.MyRef} type="text" placeholder="点击弹出" />
<input ref={this.MyRef1} type="text" placeholder="点击弹出" />
createRef step2:通过API,创建React的容器,会将DOM元素赋值给实例对象的名称为容器的属性的current
MyRef = React.createRef();
MyRef1 = React.createRef();
// 调用
btnOnClick = () =>{
// 创建之后,将自身节点,传入current中
console.log(this.MyRef.current.value);
}
事件处理
React 使用自定义事件,非原生 DOM 事件
React 事件通过事件委托方式处理(更高效)
可用 event.target
获取 DOM 减少 refs
使用
包含表单元素的组件分为非受控租价与受控组件
注意:官方推荐受控组件,更好的控制组件生命流程
#### 安装依赖
$ npm install
#### 启动服务
$ npm start # visit http://localhost:3333
├── build/ # 构建产物
├── mock/ # 本地模拟数据
│ ├── index.[j,t]s
├── public/
│ ├── index.html # 应用入口 HTML
│ └── favicon.png # Favicon
├── src/ # 源码路径
│ ├── components/ # 自定义业务组件
│ │ └── Guide/
│ │ ├── index.[j,t]sx
│ │ ├── index.module.scss
│ ├── layouts/ # 布局组件
│ │ └── BasicLayout/
│ │ ├── index.[j,t]sx
│ │ └── index.module.scss
│ ├── pages/ # 页面
│ │ └── Home/ # home 页面,约定路由转成小写
│ │ ├── components/ # 页面级自定义业务组件
│ │ ├── models.[j,t]sx # 页面级数据状态
│ │ ├── index.[j,t]sx # 页面入口
│ │ └── index.module.scss # 页面样式文件
│ ├── configs/ # [可选] 配置文件
│ │ └── menu.[j,t]s # [可选] 菜单配置
│ ├── models/ # [可选] 应用级数据状态
│ │ └── user.[j,t]s
│ ├── utils/ # [可选] 工具库
│ ├── global.scss # 全局样式
│ ├── routes.[j,t]s # 路由配置
│ └── app.[j,t]s[x] # 应用入口脚本
├── build.json # 工程配置
├── README.md
├── package.json
├── .editorconfig
├── .eslintignore
├── .eslintrc.[j,t]s
├── .gitignore
├── .stylelintignore
├── .stylelintrc.[j,t]s
├── .gitignore
└── [j,t]sconfig.json
import * as React from 'react';
const HelloWorld = () => {
function MyButton() {
return <button>I'm a button</button>;
}
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
};
export default HelloWorld;
import { lazy } from 'ice';
import BasicLayout from '@/layouts/BasicLayout';
const Dashboard = lazy(() => import('@/pages/Dashboard'));
const HelloWorld = lazy(() => import('@/pages/HelloWorld'));
const routerConfig = [
{
path: '/',
component: BasicLayout,
children: [
{
path: '/HelloWorld',
component: HelloWorld,
},
{
path: '/',
component: Dashboard,
},
],
},
];
export default routerConfig;
react-demo-xiaojin/src/layouts/BasicLayout/menuConfig.js
const headerMenuConfig = [];
const asideMenuConfig = [
{
name: 'Dashboard',
path: '/',
icon: 'smile',
},
{
name: 'HelloWorld',
path: '/HelloWorld',
icon: 'smile',
},
];
export { headerMenuConfig, asideMenuConfig };
function MyButton() {
return (
<button>I'm a button</button>
);
}
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
悄悄说一句:React 组件必须以大写字母开头,而 HTML 标签则必须是小写字母
JSX简介
var ele = <h1>Hello JSX!</h1>
基本语法规则
(1)小写字母开头,代表该标签转为html中同名元素
(2)大写字母开头,代表组件
JSX 标签,你必须为所有最高层级的标签添加一个共同的父标签,例如使用下面的标签作为父标签
<div>...</div> 或 <>...</>
function AboutPage() {
return (
<>
<h1>About</h1>
<p>Hello there.<br />How do you do?</p>
</>
);
}
在 React 中,通过 className 这个属性来指定 CSS 类。它和 HTML 的 class 属性的功能是一样的:
<img className="avatar" />
然后在一个单独的 CSS 文件中为其编写 CSS 样式:
/* In your CSS */
.avatar {
border-radius: 50%;
}
return (
<h1>
{user.name}
</h1>
);
return (
<img
className="avatar"
src={user.imageUrl}
/>
);
悄悄告诉你:style={{}} 是 对象被放在了 style={ } 花括号里哦
return (
<>
<h1>{user.name}</h1>
<img
className="avatar"
src={user.imageUrl}
alt={'Photo of ' + user.name}
style={{
width: user.imageSize,
height: user.imageSize
}}
/>
</>
);
}
let content;
if (isLoggedIn) {
content = <AdminPanel />;
} else {
content = <LoginForm />;
}
return (
<div>
{content}
</div>
);
<div>
{isLoggedIn ? (
<AdminPanel />
) : (
<LoginForm />
)}
</div>
<div>
{isLoggedIn && <AdminPanel />}
</div>
const products = [
{ title: 'Cabbage', id: 1 },
{ title: 'Garlic', id: 2 },
{ title: 'Apple', id: 3 },
];
const listItems = products.map(product =>
<li key={product.id}>
{product.title}
</li>
);
return (
<ul>{listItems}</ul>
);
function MyButton() {
function handleClick() {
alert('You clicked me!');
}
return (
<button onClick={handleClick}>
Click me
</button>
);
}
从useState获得:当前状态(count)和更新它的函数(setCount)。你可以给它们取任何名字,惯例是[something, setSomething]。第一次显示按钮时,count将为0,因为将0传递给了useState()。当要改变状态时,调用setCount()并将新值传递给它。单击此按钮将增加计数器, React会再次调用你的组件函数。这一次,count将是1 …
import { useState } from 'react';
function MyButton() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<button onClick={handleClick}>
Clicked {count} times
</button>
);
}
以use开头的函数称为Hooks。useState是React提供的一个内置钩子。你可以在React API参考中找到其他内置Hooks。您还可以通过组合现有的hook来编写自己的hook。钩子比常规函数更具限制性。你只能在组件的顶层调用Hooks(或其他Hooks)。
import { useState } from 'react';
function MyButton({ count, onClick }) {
return (
<button onClick={onClick}>
Clicked {count} times
</button>
);
}
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update together</h1>
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
</div>
);
}
import Avatar from './Avatar.js';
function Card({ children }) {
return (
<div className="card">
{children}
</div>
);
}
export default function Profile() {
return (
<Card>
<Avatar
size={100}
person={{
name: 'Katsuko Saruhashi',
imageId: 'YfeOqp2'
}}
/>
</Card>
);
}
import { getImageUrl } from './utils.js';
export default function Avatar({ person, size }) {
return (
<img
className="avatar"
src={getImageUrl(person)}
alt={person.name}
width={size}
height={size}
/>
);
}
export function getImageUrl(person, size = 's') {
return (
'https://i.imgur.com/' +
person.imageId +
size +
'.jpg'
);
}
欢迎大家指出文章需要改正之处~
学无止境,合作共赢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。