关于组件--React
组件按照页面结构可以分成,头部、底部、内容部分。这样就可以写三个组件。
组件内部还可以包含下一级组件,
比如头部,可以包含登录,注册等组件。
底部 可以 包含一些链接等。
内容部分可以包含表单组件、按钮组件等一些功能组件。
组件的好处很多,
有利于细化UI逻辑,不同组件控制不同的功能点。
有利于代码复用,不同页面使用相同的组件。
有利于人员分工,不同工程师负责不同的组件。
React 的核心概念就是组件。
JSX语法特点就是 凡是使用JavaScript的值的地方,都可以使用类似的HTML的语法。
有两个注意点:1、标签必须是闭合的。2、顶层只能有一个标签,即只有一个根元素。
JSX语法允许JavaScript和HTML混写。
const element = (
<h1>
Hello, {formatName(user)}!
</h1>
);
虽然输出 JSX 代码的函数就是一个 React 组件,但是这种写法只适合那些最简单的组件。更正式、更通用的组件写法,要使用 ES6 类(class)的语法。
import React from 'react' class ShoppingList extends React.Component {
render() {
return (
<div>
<h1>shopping list for {this.props.name} </h1>
<ul>
<li>跑鞋</li>
<li>压缩裤</li>
<li>滑板</li>
</ul>
<div>this.props.children: {this.props.children}</div>
</div>
)
}
} export default ShoppingList;
组件内部,所有参数都放在this.props这个属性上面。
this.props
对象有一个非常特殊的参数this.props.children
,表示当前组件“包裹”的所有内容。
React 规定,组件的内部状态记录在this.state
这个对象上面。
生命周期
组件运行过程中存在不同阶段,React 为这些阶段提供了钩子方法,允许开发者自定义每个阶段自动执行的函数。这些方法统称为生命周期方法(lifecycle methods)。
其中componentDidMount()
、componentWillUnmount()
和componentDidUpdate()
就是三个最常用的生命周期方法。其中,componentDidMount()
会在组件挂载后自动调用,componentWillUnmount()
会在组件卸载前自动调用,componentDidUpdate()
会在 UI 每次更新后调用(即组件挂载成功以后,每次调用 render 方法,都会触发这个方法)。
还有3个不常用的:
shouldComponentUpdate(nextProps, nextState)
:每当this.props
或this.state
有变化,在render
方法执行之前,就会调用这个方法。该方法返回一个布尔值,表示是否应该继续执行render
方法,即如果返回false
,UI 就不会更新,默认返回true
。组件挂载时,render
方法的第一次执行,不会调用这个方法。static getDerivedStateFromProps(props, state)
:该方法在render
方法执行之前调用,包括组件的第一次记载。它应该返回一个新的 state 对象,通常用在组件状态依赖外部输入的参数的情况。getSnapshotBeforeUpdate()
:该方法在每次 DOM 更新之前调用,用来收集 DOM 信息。它返回的值,将作为参数传入componentDidUpdate()
方法。
受控与非受控组件
非受控组件:
import React from 'react' const MyInput = ({onChange}) => (
<input onChange={onChange} />
)
class Demo extends React.Component {
onTextChange = (event) => {
console.log(event.target.value);
}
onTextReset = () => {
// 这里该怎么做?
// 拿到 input 的值,然后 = '' ?
}
render() {
return (
<div>
<MyInput onChange={this.onTextChange} />
<button onClick={this.onTextReset}>Reset</button>
</div> )
}
} export default Demo;
看起来,要修改MyInput中的值并不容易,对于这种不能直接控制状态的组件,我们称之为“非受控组件”。
受控组件:
将上面代码进行修改
import React from 'react' const MyInput = ({value = '', onChange}) => (
<input value={value} onChange={onChange} />
)
class Demo extends React.Component {
state = {
text: '',
}
onTextChange = (event) => {
console.log(event.target.value);
this.setState({text: event.target.value})
}
onTextReset = () => {
// 这里该怎么做?
// 拿到 input 的值,然后 = '' ?
this.setState({text: ''})
}
render() {
return (
<div>
<MyInput value={this.state.text} onChange={this.onTextChange} />
<button onClick={this.onTextReset}>Reset</button>
</div> )
}
} export default Demo;
这样 MyInput 的输入就完全由value值决定。
“受控”与“非受控”两个概念,区别在于这个组件的状态是否可以被外部修改。一个设计得当的组件应该同时支持“受控”与“非受控”两种形式,即当开发者不控制组件属性时,组件自己管理状态,而当开发者控制组件属性时,组件该由属性控制。而开发一个复杂组件更需要注意这点,以避免只有部分属性受控,使其变成一个半受控组件。
关于组件--React的更多相关文章
- React 克隆组件 -- React.cloneElement(可以用来修改子组件属性值,复制子组件,添加子组件)
项目要求实现按钮级权限,简单来说就是需要通过后台数据绑定来控制前端页面哪些操作按钮需要渲染,哪些操作按钮不需要渲染, 大体的方案是: 在原有的按钮标签外再套一层按钮权限控制标签,然后每个具体的按钮对照 ...
- 野心勃勃的React组件生命周期
当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台. React组件 React实现了UI=Fn(St ...
- React入门--------组件的生命周期
Mounting/组件挂载相关: componentWillMount componentDidMount Updating/组件更新相关: componentWillReceiveProps sho ...
- [react 基础篇]——React.createClass()方法同时创建多个组件类
react 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 一个组 ...
- 学习React系列(七)——Fragments、Portals、Error Boundaries与WEB组件
React.Fragment portals Error Boundaries WEB组件 React.Fragment 想象一个场景,想把td包装为组件添加到table中去,代码如下: class ...
- react创建组件的几种方式及其区别
react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件 ③.es6形式的extends React.Component定义的组 ...
- React 的组件与 this.props对象
1.组件 React 允许将代码封装成组件,然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 的方法就是用于生成一个组件类. 2.this.props对象 ...
- 强大的拖拽组件:React DnD 的使用
强大的拖拽组件:React DnD 的使用 react.js 10.6k 次阅读 · 读完需要 25 分钟 17 文章首发我的个人blog : 原文链接 学习 React DnD 的最初原因是阅读 ...
- React创建组件的三种方式及其区别
内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...
随机推荐
- 微信小程序起步
微信小程序 文档 微信小程序开发文档 本质 so微信小程序到底是什么?是原生的app还是H5应用? 简单来说,小程序是一种应用,运行的环境是微信(App)进程中,使用了部分的H5技术 目录介绍 app ...
- W tensorflow/core/util/ctc/ctc_loss_calculator.cc:144] No valid path found 或 loss:inf的解决方案
基于Tensorflow和Keras实现端到端的不定长中文字符检测和识别(文本检测:CTPN,文本识别:DenseNet + CTC),在使用自己的数据训练这个模型的过程中,出现如下错误,由于问题已经 ...
- 第一个APP上架IOS审核相关的记录
以前一直没做过APP开发,第一版是用WAP版做的,采用了light7框架制作,没有UI设计. 升级到第二版之后,使用了HBUILDER的方式开发,https://dcloud.io/ 官方在这里. 目 ...
- css权重等级
1.问题起因(在一次偶然编写css发现的,.div2 p>.div1 p>.p1,然后做了测试并找查相关资料) 2.解决方案 首先看哪一级的权重高 1.!important,加在样式属性值 ...
- linux系统下使用nginx反向代理asp.net core,并配置免费的https证书
反向代理是为动态 Web 应用提供服务的常见设置. 反向代理终止 HTTP 请求,并将其转发到 ASP.NET Core 应用. 1.在asp.net core项目中的Startup的Configur ...
- Golang程序调试工具介绍(gdb vs dlv)
原文:http://lday.me/2017/02/27/0005_gdb-vs-dlv/ 通过log库输出日志,我们可以对程序进行异常分析和问题追踪.但有时候,我也希望能有更直接的程序跟踪及定位工具 ...
- centos如何强行踢掉某登录用户
linux是一个多用户操作系统,用户可以在不同的地方链接上LINUX服务器. 在系统中我们可以用w或者who来查看用户: [root@7273 ~]# who root pts/0 2019-04-1 ...
- javascript DOM拓展
针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! DOM拓展 1选择符 API 1.1 querySelector() 由docu ...
- Gin-Go学习笔记八:Gin-Web框架 常用的包
常用的包 1> 在java,.net,php,node.js等语言常常会使用到包的概念.包的使用,可以加快项目的进度的开发,以及更好的实现项目的效果.我在网上查到了包的作用如下: 1.包 ...
- 【转载】Gradle学习 第三章:教程
转载地址:http://ask.android-studio.org/?/article/15 3.1. Getting Started 入门The following tutorials intro ...