前言:
通过学习尚硅谷react课程基础篇的一些小笔记
01_虚拟DOM两种创建方式
-
js创建
//1.创建虚拟DOM
const VDOM = React.createElement('h1', { id: 'title' },'Hello_React')
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM, document.querySelector('#test'))
-
jsx创建
//1.创建虚拟DOM
const VDOM = (
<h1 id="title">
<span>hello_react</span>
</h1>
)
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM,document.querySelector('#test'))
02_关于虚拟DOM
-
本质是object类型的对象(一般对象)
-
虚拟DOM比较'轻',真实dom比较'重',即身上的方法.因为虚拟DOM是react在使用 无需真实dom那么多的属性
-
虚拟DOM最终会被React转化为真实DOM,呈现在页面上
03_jsx语法规则
-
定义虚拟DOM时,不要写引号
-
标签中混入JS表达式时要用{}
-
样式的类名指定不能使用class,只能是calssName
-
只能有一个根标签
-
标签必须闭合
-
内联样式,要用style={{key:value}}的形式来写
-
标签首字母
-
若小写字母开头 则将标签转为html中同名元素
-
若大写字母开头 react就去渲染对应的组件 若没有对应的组件就报错
-
//1.创建虚拟dom
const VDOM = (
<div>
<h1 id={myId.toLowerCase()}>
<span className='demo'>{myData.toUpperCase()}</span>
</h1>
<p style={{ backgroundColor: 'orange', color: 'green' }}>内联样式</p>
<input type="text" />
</div>
)
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM, document.querySelector('#test'))
04_jsx中的{}的注意点
jsx中{}里只能包含表达式不能包含语句
-
表达式:一个表达式会产生一个值 可以放到任何一个需要值的地方
-
例: (1):a
(2):a+b
(3):demo()
(4):arr.map()
-
-
语句(代码)
-
例: (1):if(){}
(2):for(){}
(3):swich(){}
-
05_react创建组件
-
函数式组件
-
执行了渲染发生了:
-
react 解析组件标签找到了MyComponent组件
-
发现是函数定义的 将函数返回值的虚拟DOM转化为真实DOM,随后呈现在页面.
-
-
// 1.创建函数式组件
function MyComponents() {
return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2>
}
// 2.渲染组件到页面
ReactDOM.render(<MyComponents />, document.querySelector('#test'))
-
类式组件
-
执行了渲染发生了:
-
react 解析组件标签找到了MyComponent组件
-
发现是类定义的 随后自动new出来该类的实例,并通过实例调用到原型上的render方法
-
将render 返回值的虚拟DOM转化为真实DOM,随后呈现在页面中
-
// 1.创建一个类式组件 class MyComponents extends React.Component { render() { //render 是MyComponents的原型对象上 供实例使用 return <h2>我是用类定义的组件(适用于【复杂组件】的定义)</h2> } } // 2.渲染组件到页面 ReactDOM.render(<MyComponents />, document.querySelector('#test'))
-
06-组件实例的三大属性-state
完整写法
class Weather extends React.Component {
constructor(props) {
super(props)
// 初始化状态
this.state = { isHot: false }
// 解决toggleHot中的this指向问题
this.toggleHot = this.toggleHot.bind(this)
}
render() {
// 读取状态
const { isHot } = this.state
return <h2 onClick={this.toggleHot}>今天的天气很{isHot ? '炎热' : '凉爽'}</h2>
}
toggleHot() {
// 直接修改state中的值 要调用setState这个API
this.setState({isHot:!this.state.isHot})
}
}
ReactDOM.render(<Weather />, document.querySelector('#test'))
简写
class Weather extends React.Component {
// 初始化状态
state = { isHot: true }
render() {
const { isHot } = this.state
return <h2 onClick={this.toggleHot}>今天的天气很{isHot ? '炎热' : '凉爽'}</h2>
}
// 自定义方法 -- 要用赋值语句的形式+箭头函数
toggleHot = () => {
this.setState({ isHot: !this.state.isHot })
}
}
ReactDOM.render(<Weather />, document.querySelector('#test'))
07_组件实例的三大属性-props
-
props的基本使用
class Person extends React.Component { render() { const { name, age, sex } = this.props return ( <ul> <li>name:{name}</li> <li>age:{age + 1}</li> <li>sex:{sex}</li> </ul> ) } } // 传入不同的值 ReactDOM.render(<Person name='Tom' age={19} sex='男' />, document.querySelector('#test')) ReactDOM.render(<Person name='jerry' age={17} sex='女' />, document.querySelector('#test2'))
-
对props进行限制
//此时在类外面创建 // 对props参数进行限定 Person.propsTypes = { name: PropTypes.string.isRequired, // 限制name属性为必填和必须为字符串 age: PropTypes.number, // 限制age属性必须为数字 sex: PropTypes.string, // 限制sex属性为字符串 speak: PropTypes.func // 限制speak是个函数 } // 对props参数设置默认值 Person.defaultProps = { sex: '男', age: 18 }
-
类型限制的简写形式
//此时在类中创建使用static关键字 static propsTypes = { name: PropTypes.string.isRequired, // 限制name属性为必填和必须为字符串 age: PropTypes.number, // 限制age属性必须为数字 sex: PropTypes.string, // 限制sex属性为字符串 speak: PropTypes.func // 限制speak是个函数 } // 对props参数设置默认值 static defaultProps = { sex: '男', age: 18 }
-
函数组件的props用法
// 对参数进行限定---Person创建的函数组件
Person.propsTypes = {
name: PropTypes.string.isRequired, // 限制name属性为必填和必须为字符串
age: PropTypes.number, // 限制age属性必须为数字
sex: PropTypes.string, // 限制sex属性为字符串
speak: PropTypes.func // 限制speak是个函数
}
// 对props参数设置默认值
Person.defaultProps = {
sex: '男',
age: 18
}
08_组件实例的三大属性-refs
字符串写法
showData = () =>{
console.log(this.refs.input1.value);
}
showData2 = () =>{
console.log(this.refs.input2.value);
}
render(){
return (
<div>
<input ref="input1" type="text" placeholder="点击按钮提示数据" />
<button onClick={this.showData}>点击展示左侧输入的值</button>
<input ref="input2" type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
</div>
)
}
回调函数写法
showData = () => {
console.log(this.input1.value);
}
showData2 = () => {
console.log(this.input2.value);
}
render() {
return (
<div>
<input ref={c => this.input1 = c} type="text" placeholder="点击按钮提示数据" />
<button onClick={this.showData}>点击展示左侧输入的值</button>
<input ref={c => this.input2 = c} type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
</div>
)
}
CreateRefs写法
每个ref指定的元素都只能有一个createRef()接收
myRef1 = React.createRef()
myRef2 = React.createRef()
showData = () => {
console.log(this.myRef1.current.value);
}
showData2 = () => {
console.log(this.myRef2.current.value);
}
render() {
return (
<div>
<input ref={this.myRef1} type="text" placeholder="点击按钮提示数据" />
<button onClick={this.showData}>点击展示左侧输入的值</button>
<input ref={this.myRef2} type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
</div>
)
}
09_事件处理
-
通过onXxx属性指定事件处理函数(注意大小写)
-
:React使用的是自定义事件,而不是使用的原生DOM事件 ---为了兼容性
-
React中的事件是通过事件委托方式处理的 --- 为了高效
-
-
通过exent.target得到发生事件的DOM元素对象
showData = () => {
console.log(this.input1.value)
}
showData2 = (e) => {
console.log(e.target.value)
}
render() {
return (
<div>
<input ref={c => this.input1 = c} type="text" placeholder="点击按钮提示数据" />
<button onClick={this.showData}>点击展示左侧输入的值</button>
<input type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
</div>
)
}
10_表单提交数据
非受控组件
handleSubmit = (e) => {
e.preventDefault()
const { userName, password } = this
console.log(`用户名是${userName.value},密码是${password.value}`);
}
render() {
return (
<form onSubmit={this.handleSubmit}>
用户名: <input ref={c => this.userName = c} type="text" name="username" />
密码: <input ref={c => this.password = c} type="password" name="password" />
<button>提交数据</button>
</form>
)
}
受控组件
state = { userName: '', password: '' }
saveUserName = (e) => {
this.setState({ userName: e.target.value })
}
savePassword = (e) => {
this.setState({ password: e.target.value })
}
handleSubmit = (e) => {
e.preventDefault()
const { userName, password } = this.state
console.log(`用户名是${userName},密码是${password}`);
}
render() {
return (
<form onSubmit={this.handleSubmit}>
用户名: <input onChange={this.saveUserName} type="text" name="username" />
密码: <input onChange={this.savePassword} type="password" name="password" />
<button>提交数据</button>
</form>
)
}
11_高阶函数和函数柯里化
-
高阶函数:如果一个函数符合下列两个条件之一 就是高阶函数
-
该函数接收的参数是一个函数 那么该函数可以呗称之为高阶函数
-
该函数调用的返回值依然是一个函数 就被称之为高阶函数
-
例 :Promise setTimeout arr.map()等
-
-
函数的柯里化
-
通过函数的调用继续返回函数的方式 实现多次接收参数最后统一处理函数的编码形式
-
state = { username: '', password: '' }
saveFormData = (DataType) => {
return (e) => {
this.setState({[DataType]:e.target.value})
}
}
handleSubmit = (e) => {
e.preventDefault()
const { username, password } = this.state
console.log(`用户名是${username},密码是${password}`);
}
render() {
return (
<form onSubmit={this.handleSubmit}>
用户名: <input onChange={this.saveFormData('username')} type="text" name="username" />
密码: <input onChange={this.saveFormData('password')} type="password" name="password" />
<button>提交数据</button>
</form>
)
}
12_生命周期
旧生命周期
新生命周期
-
在新版本中 修改了:
-
componentWillMount钩子 修改为UNFAFE_componentWillMount 后续版本可能废弃
-
componentWillUpdate钩子 修改为UNFAFE_componentWillUpdate 后续版本可能废弃
-
componentWillReceiveProps钩子 修改为UNFAFE_componentWillReceiveProps 后续版本可能废弃
-
-
在新版本中 新增了:
-
getDerivedStateFromProps 若state的值在任何时候都取决于props,那么就可以使用getDerivedStateProps
-
getSnapshotBeforeUpdate 在更新渲染之前做些事情 例获取更新前的滑轮距离...
-