01 : React的基本语法和使用
React中 组件定义有两种方法:
函数组件类组件
组件的名称要遵循 大驼峰写法
-
函数组件:
-
函数组件就是一个
返回 jsx 对象的函数 -
类组件:
-
类组件必须是
React.Component 的子类声明组件时必须 定义render函数并且必须返回一个 jsx对象作为组件的视图结构
02 : jsx标签基本用法
- 内容插值:
- jsx 语法 允许使用
{ }的方式对内容进行插值 插入的内容可以是字面量变量表达式 - 循环:
- 循环的重点几乎是将数据数组转化为
jsx 对象组成的数组 - 使用
map(item,index)=> { }方法进行循环遍历key值等于index - 条件判断
条件判断是根据某些条件控制标签 显示/隐藏 创建或销毁
03: styles样式的使用:
- 一般为标签添加最直接的方法
style属性class属性(因为与class不起冲突 这里改为className属性) - style属性:
- 在标签内部直接定义
style={ { color:red/color } } - className属性:
- 这里可以借助
classNames模块实现灵活类名管理 导入使用像插件一样的导入方式import classNames from 'classNames' - 用法:
className={ classNames( '类名',{ 可以是表达式 } ) }(注意:这里的类名使用的是外部链接样式 事先要先导入!)
04: events事件
- 在React中添加事件 需要声明式的语法在标签行内属性进行注册
- 具体的语法格式是
{ on + 事件类型名称 = 事件函数 } - 期望使自定义参数方法来使用
onClick={ () => { } } - 函数组件添加事件:
可以在属性的值上直接通过函数 函数默认可以获取到一个事件对象的参数- 类组件事件函数
类组件的事件函数主要额外注意事件函数的定义位置 和 this执行问题
05: state状态
- 类组件状态由两种定义方式:
- 1、
this上定义 state属性属性值是一个对象(优先级更高)
- 2、
class的简化语法 直接定义 this属性(推荐写法)
在类组件中只能使用
this.setState()方法 来修改当前组件状态否则无法触发视图效果更新
setState( ) 方法的参数需要接收一个对象 React会把这个对象和组件的 state 对象进行合并操作 效果类似于
Object.assgin()
06:受控组件(form)
- React中受控组件 一般指的是表单标签
- React对 表单的事件进行了适当的改造
input事件被替换成了 change 事件 - 在使用input标签时 不能只为标签设置状态
value属性否则会让标签变为只读 用户无法输入内容 处理的方式是:value + onChange组合 或者使用defaultValue替代value或者添加onChange事件
07: Props
- React允许在父组件中使用子组件 在子组件行内中添加自定义属性 被使用组件内部特定语法进行接收 对于子组件来说 被添加的行内属性统称
Propos - 类组件爱爱你接收的行内属性会自动收集到
this.props上在构造器(controuster)中 必须使用super传递props 否则不会获取到
08: slots (插槽)
import { Component } from "react";
class Card extends Component {
render() {
console.log(this.props);
//传递内容形式的不同 children 属性值获取的结果也不同
//1. 只传递文本 属性值为字符串
//2. 传递单个标签 属性值为对应 jsx 对象
//3. 传递多个标签 属性值是 jsx 对象组成的数组 数组内容的顺序就是标签的书写顺序
//获取的内容只有当前组件的直接子标签
//jsx 对象是标签的另一种表现形式 可以直接在标签结构内插值使用
//一般情况下 children 全部作为默认插槽的内容
//想要实现具名插槽 可以通过行内属性的方式传递子组件 (普通的 props方式)
let { header, footer, CaraAside } = this.props;
return (
<fieldset>
<legend>卡片</legend>
<h2 className="card-header">{header}</h2>
<div className="card-content"> {this.props.children}</div>
<p className="card-footer">{footer}</p>
<CaraAside></CaraAside>
</fieldset>
);
}
}
class Panel extends Component {
state = {
x: "父组件的状态值",
};
render() {
let { children: Children } = this.props;
let { x } = this.state;
return (
<fieldset>
<legend>函数 children</legend>
<Children a="1" x={x}></Children>
{Children({ b: 2, x })}
</fieldset>
);
}
}
09:context(上下文)
- 创建上下文对象 不负责制作数据 只负责传递数据
const context = createContext( );
- 获取组件树的状态注入组件和子组件的状态消费组件
const { Provider, Consumer } = context;
- 在函数内 通过 this.context 属性获取注入的值
et { text, changeText } = this.context;
前端框架处理数据的原则
哪里提供数据 对应的也需要提供修改数据的方法使用数据的位置上不要直接修改数据唯一数据源 + 单向数据流