react
介绍React的入门讲解(二)
大家好,我是
小超
同学。最近我正在学习React
、阅读JS
文档,并整理Node
的笔记。对于React
,这是关于 React 的第二篇文章,也是我学习的第三个框架,内容如有错误,欢迎大家指正
祝愿你生活明朗,万物可爱!🌞🌻
当应用是以多组件的方式实现,这个应用就是一个组件化的应用
注意:
- 组件名必须是首字母大写
- 虚拟DOM元素只能有一个根元素
- 虚拟DOM元素必须有结束标签
< />
渲染类组件标签的基本流程
render()
得到虚拟 DOM ,并解析为真实 DOMjsx//1.先创建函数,函数可以有参数,也可以没有,但是必须要有返回值 返回一个虚拟DOM
function Welcome (props) {
return <h1>{props.name},我是用函数定义的组件(适用于【简单组件】 的定义)</h1>
}
// 2. 渲染處拟DOM到页面
ReactDOM.render(<Welcome name="hello"></Welcome>, document.getElementById("example"));
上面的代码经历了以下几步:
ReactDOM.render()
函数,并传入 <Welcome name="hello" />
作为参数。Welcome
组件,并将 {name: 'hello'}
作为 props 传入。Welcome
组件将 hello,我是用函数定义的组件(适用于【简单组件】 的定义)
元素作为返回值。2. 类式组件
jsx// 1. 创建组件类 —— 本质就是创建一个类
class Welcome extends React.Component {
//render是放在哪里的?类(Welcome)的原型对象上,供实例使用。
// render中的this是谁? render中的this是(Welcome)组件实例对象
render () {
console.log('render中的this: ', this);
return <h1>我是用类定义的组件(适用于【复尔组件】的定义) </h1>
}
}
// 2. 渲染處拟DOM到页面
ReactDOM.render(<Welcome name="hello" />, document.getElementById("example"));
执行了ReactDoM.render(.……..….之后,发生了什么?
上面的代码经历了以下几步:
在Class类式组件中遇到的问题
undefined
如何解决
this
指向React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。
简单的说就是组件的状态,也就是该组件所存储的数据
类式组件中的使用
使用的时候通过this.state
调用state
里的值
在类式组件中定义state
state
state
来初始化修改 state
在类式组件的函数中,直接修改state
值
jsxconst { isHot } = this.state
isHot = !isHot
页面的渲染靠的是render函数
这时候会发现页面内容不会改变,原因是 React 中不建议 state
不允许直接修改,而是通过类的原型对象上的方法 setState()
setState()
jsxthis.setState(partialState, [callback]);
partialState
: 需要更新的状态的部分对象callback
: 更新完状态后的回调函数正确写法:有两种写法:
jsxthis.setState({
isHot:!isHot
})
// 传入一个函数,返回x需要修改成的对象,参数为当前的 state this.setState(state => ({count: state.count+1});
setState
是一种合并操作,不是替换操作
setState
操作后,React 会自动调用一次 render()
render()
的执行次数是 1+n (1 为初始化时的自动调用,n 为状态更新的次数)与state
不同,state
是组件自身的状态,而props
则是外部传入的数据
类式组件中使用
在使用的时候可以通过 this.props
来获取值 类式组件的 props
:
props
参数里可以获取Ï到 props
defaultProps
属性来操作 props
的默认值,都是直接添加在类式组件的原型对象上的(所以需要添加 static
)...
运算符来简化函数式组件中的使用
函数在使用props的时候,是作为参数进行使用的(props)
函数组件的 props
定义:
props
的值props
props
默认值同样设置在原型对象上Refs 提供了一种方式,允许我们访问 DOM 节点或在 render
方法中创建的 React 元素。
在我们正常的操作节点时,需要采用DOM API 来查找元素,但是这样违背了 React 的理念,因此有了refs
有三种操作refs
的方法,分别为:
createRef
形式字符串形式refs
虽然这个方法废弃了,但是还能用,还很好用
回调形式的refs
组件实例的ref
属性传递一个回调函数c => this.input1 = c
(箭头函数简写),这样会在实例的属性中存储对DOM节点的引用,使用时可通过this.input1
来使用
使用方法
jsx<input ref={cur => this.input1 = cur } type="text" placeholder="点击按钮提示数据"/>
我的理解
cur
会接收到当前节点作为参数,ref
的值为函数的返回值,也就是this.input1 = cur
,因此是给实例下的input1
赋值
createRef 形式(推荐写法)
React 给我们提供了一个相应的API,它会自动的将该 DOM 元素放入实例对象中
我们先给DOM元素添加ref属性
jsx<input ref={this.MyRef} type="text" placeholder="点击弹出" />
<input ref={this.MyRef1} type="text" placeholder="点击弹出" />
通过API,创建React的容器,会将DOM元素赋值给实例对象的名称为容器的属性的current
jsxMyRef = React.createRef();
MyRef1 = React.createRef();
注意:专人专用,一个节点创建一个容器
jsx// 调用函数
showDate = () => {
//创建之后,将自身节点,传入current中
alert(this.myRef.current.value)
}
注意:我们不要过度的使用 ref,如果发生时间的元素刚好是需要操作的元素,就可以使用事件对象去替代。过度使用有什么问题我也不清楚,可能有 bug 吧
event.target
获取发生的 DOM 元素对象,可以尽量减少 refs
的使用这里都使用了
ref
如果有很多就不合适了
实现一个小例子:一个表单用户输入框、一个密码输入框、一个登录的按钮然后输入完值后点击登录就可以拿到两个输入框的值
非受控组件
这里使用的就是非受控组件,因为有两个输入框
用户名
跟密码
都是在最后点击登录调用handleSubmit
才用他们输入的数据所以就是非受控组件;使用的是ref
绑定获取值最后点登录按钮调用函数获取它们两个输入框的值。
受控组件
这里使用的是受控组件,因为有两个输入框,分别是
用户名
和密码
。它们在各自输入完后调用handleChange
保存自己的状态到state
,最后登录时调用handleChange
,然后从state
中获取两个输入框的数据,所以这就是受控组件。
上面的例子中最后点击登录调用
handleChange
的函数柯里化写法 **handleChange
**函数的第一个参数是一个字符串,而第二个参数是由React事件系统自动传递的事件对象,其中包含了事件触发时的相关信息
在这段代码中,**
onChange
属性的值是一个箭头函数,它接收一个event
参数,然后调用handleChange
函数并传递了两个参数:一个表示需要更新的state
属性名,一个是event
事件对象。这样,handleChange
函数就可以在内部使用event
**对象来获取用户输入的文本,从而实现了双向数据绑定。
对比上面的写法,这种写法的一个好处是可以直接在**
onChange
属性中处理事件,不需要在组件定义外部额外声明一个函数。另外,这种写法可以看作是显示地将event
参数传递给handleChange
**函数,让代码更加的清晰明了,同时也可以更容易地进行单元测试和调试。
本文作者:LiuXueChao
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!