React
项目结构
|- node_modules
|- src: 存放代码
|- index.js
|- public:存放一些不需要编译打包的静态文件
|- asset: 存放需要参与编译打包的静态文件
|- index.html
|- package.json
tsx 语法入门
什么是 tsx ?
jsx(javascript and xml) 是 js 的语法扩展,允许在 js 中写 html 代码。
tsx 是在 jsx 的基础上增加了类型。
JSX 语法
HTML-like 语法
const ele = <h1>Hello JSX!</h1>;
嵌入 js 表达式
const name = 'wangzhy';
const ele = <h1>hello, {name}</h1>;
属性命名规范
- 使用
cameCase语法代替 HTML 属性命 - 动态属性通过
{}传递
const divEle = <div className="container" tabIndex="1"></div>;
<img src={user.avatarUrl}/>
自闭合标签
必须严格闭合标签,例如 <img/> 不能写成 <img>。
只能有一个根元素
const ele = (
<div>
<h1>title</h1>
<p>content</p>
</div>
);
jsx 常见用法
条件渲染
{
isLoggedIn && <UserPanel/>
}
{
score > 60 ? <PassIcon/> : <FailIcon/>
}
列表渲染
li 标签的 key 是必须要的,不然会影响性能。
<ul>
{items.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
事件绑定
<button onClick={handleClick}>Click</button>
样式处理
- 内联样式:
<div style={{ color: 'red', fontSize: 16 }}></div> - CSS 类:
<div className="my-class"></div>
与组建结合
- 自定义组件:组件名必须已大写字母开头,以便与 HTML 原生标签区分
- 传递 props:
<Button color="blue" text="Click me" /> - 子元素:使用 props.children 获取嵌套内容
JSX 底层转换
jsx 会被 babel 或 typescript 转译为 React.createElement() 调用。
<div className="box">Hello</div>
转换为:
React.createElement("div", { className: "box" }, "Hello");
每一个 JSX 元素对应一个 虚拟 DOM 对象。
虚拟 DOM 对象,是由框架内部构建的一套对象体系,基于这些对象,框架可以构建出真实 DOM 对象。
只有第一次渲染页面时是直接从 虚拟 DOM 渲染为 真实 DOM ,后续 View 更新时,需要经过 DOM-DIFF 计算出两次视图差异的地方, 渲染差异DOM。

函数组件
组件命名一般采用 PascalCase 大驼峰。
定义一个函数组件
一个函数返回的是 jsx 元素,这就是一个函数组件。
/*函数式组件*/
const DemoOne = function () {
/*返回一个 jsx 元素*/
return <div className="demo-box">demo one </div>
};
export default DemoOne;
Props 传参
props 传递过来的参数是 只读 的, 不允许修改,
props.xxx='abc'; 是会报错的。
原因:props 是被冻结的。 Object.isFrozen(props) == true
传递动态值与表达式
父组件调用子组件的时候,可以基于属性,把不同的信息传递给子组件,子组件接收相应的属性值,呈现出不同的效果,让组件的复用性更强。
<Child
score={95}
isStudent={true}
hobbies={['music', 'reading']}
info={{id: 1, role: 'admin'}}
onClick={() => console.log('Click...')}
/>
基础传参
// 父组件
const Parent = () => {
return <Child name="Alice" age={25}/>;
};
// 子组件
const Child = (props) => {
return <div>{props.name} is {props.age} years old.</div>;
};
解构 props
const Child = ({name, age}) => {
return <div>{name} is {age} years old.</div>;
};