1. 组件定义

  组件是React的核心概念,组件将应用的UI拆分成独立的、可复用的模块。

  定义组件的两种方式:

  (1)类组件:使用ES6 class

  (2)函数组件:使用函数

  使用class定义组件的两个条件:

  (1)class继承自React.Component

  (2)class内部必须定义render(),render()返回代表该组件UI的React元素。

1.1 基本组件

  HelloWorld.js:

import React, { Component } from "react"

class HelloWorld extends Component {
render() {
return (
<h1>Hello World!</h1>
);
}
} export default HelloWorld;

  Index.js:

import React from 'react';
import ReactDOM from 'react-dom'; import HelloWorld from './components/HelloWorld' ReactDOM.render(<HelloWorld />, document.getElementById('root'));

  说明:ReactDOM.render()需要先导入react-dom库,这个库会完成组件所代表的虚拟DOM节点到浏览器的DOM节点的转换。

     使用export default默认导出组件。

     default表示可以在别的文件中使用import HelloWorld from './components/HelloWorld'导入这个模块;

     如果没有default,则需要使用import { HelloWorld } from './components/HelloWorld'来导入模块。

1.2 组件的props

  组件props用于把父组件中的数据或方法传递给子组件。

  props是一个简单结构的对象,它包含的属性是由组件作为JSX标签所使用的属性组成。

  示例(1):

import React, { Component } from "react"

class HelloWorld extends Component {
render() {
return (
<h1>Hello { this.props.name }!</h1>
);
}
} export default HelloWorld;
import React from 'react';
import ReactDOM from 'react-dom'; import HelloWorld from './components/HelloWorld' ReactDOM.render(<HelloWorld name={ 'Libing' } />, document.getElementById('root'));

  示例(2):

  TodoItem.js

import React, { Component } from 'react';

class TodoItem extends React.Component {
render() {
const { id, title } = this.props; return (
<li>{ id }-{ title }</li>
);
}
} export default TodoItem;

  TodoList.js

import React, { Component } from 'react';

import TodoItem from './TodoItem';

const data = [
{ id: 1, title: 'ToDo' },
{ id: 2, title: 'In Progress' },
{ id: 3, title: 'Done' }
] class TodoList extends Component {
render() {
return (
<ul>
{
data.map((item) =>
<TodoItem
id={ item.id }
title={ item.title }
/>
)
}
</ul>
);
}
} export default TodoList;

  index.js

import React from 'react';
import ReactDOM from 'react-dom'; import TodoList from './components/TodoList' ReactDOM.render(<TodoList />, document.getElementById('root'));

1.3 组件的state

  组件的state是组件内部的姿态,state的变化最终将反映在组件UI的变化。

  在组件的构造方法constructor中通过this.state定义组件的初始状态,并通过调用this.setState()改变组件状态,进而组件UI会随之重新渲染。

  修改TodoItem.js

import React, { Component } from 'react';

class TodoItem extends React.Component {
constructor(props) {
super(props); this.state = {
count: 0
};
} handleClick() {
let count = this.state.count;
count++; this.setState({
count: count
});
} render() {
const { id, title } = this.props; return (
<li>
{ id }-{ title }-{ this.state.count }
<button
onClick={() => {
this.handleClick();
}}
>+1</button>
</li>
);
}
} export default TodoItem;

1.4 有状态组件和无状态组件

  state用来反映组件内部状态的变化。

  无状态组件:如果一个组件的内部状态是不变的,则用不到state。

  有状态组件:如果一个组件的内部状态会发生变化,就需要使用state来保存变化。

  示例:

  HelloWorld.js

import React from 'react';

function HelloWorld(props) {
return <h1>Hello { props.name }!</h1>;
} export default HelloWorld;

  注:由于使用了JSX,需要导入React。

  index.js

import React from 'react';
import ReactDOM from 'react-dom'; import HelloWorld from './components/HelloWorld' ReactDOM.render(<HelloWorld name={ 'World' } />, document.getElementById('root'));

  在使用无状态组件时,尽量定义函数组件。

  在开发React应用时,要先思考哪些组件应该设计成有状态组件,哪些组件应该设计成无状态组件。并且,尽可能多的使用无状态组件,无状态组件不用关心状态变化,只聚焦于UI的展示,更容易复用。

  React应用组件设计的一般思路:通过定义少数的有状态组件管理整个应用的状态变化,并且将状态通过props传递给其余的无状态组件,由无状态组件完成页面绝大部分UI的渲染。

  有状态组件主要关注处理状态变化的业务逻辑,无状态组件主要关注组件的UI渲染。

1.5 属性校验和默认属性

1.5.1 属性校验

  React提供PropTypes用于校验组件属性的类型。

import React from 'react';
import PropTypes from 'prop-types' class HelloWorld extends React.Component {
render(){
return (<h1>Hello { this.props.name }!</h1>);
}
} HelloWorld.propTypes = {
name: PropTypes.string
} export default HelloWorld;
import React from 'react';
import ReactDOM from 'react-dom'; import HelloWorld from './components/HelloWorld' ReactDOM.render(<HelloWorld name={'World'} />, document.getElementById('root'));

  若属性类型设置number,则报错提示。

import React from 'react';
import PropTypes from 'prop-types' class HelloWorld extends React.Component {
render(){
return (<h1>Hello { this.props.name }!</h1>);
}
} HelloWorld.propTypes = {
name: PropTypes.number
} export default HelloWorld;

import React from 'react';
import PropTypes from 'prop-types' class HelloWorld extends React.Component {
render(){
return (<h1 style={ this.props.style }>Hello { this.props.name }!</h1>);
}
} HelloWorld.propTypes = {
name: PropTypes.string,
style: PropTypes.shape ({
color: PropTypes.string,
fontSize: PropTypes.number
}).isRequired
} export default HelloWorld;
import React from 'react';
import ReactDOM from 'react-dom'; import HelloWorld from './components/HelloWorld' ReactDOM.render(<HelloWorld
style={{ color: 'red', fontSize: 14 }}
name={'World'}
/>, document.getElementById('root'));

  示例中,style是一个对象,包含两个属性color和fontSize,color是字符串类型,fontSize是数字类型。

  如果属性是组件的必须属性,在PropTypes的类型属性上调用isRequired。

1.5.2 默认属性

  React提供为组件属性指定默认值,组件defaultProps。当组件属性未被赋值时,组件会使用defaultProps定义的默认属性。

import React from 'react';

class HelloWorld extends React.Component {
render(){
return (<h1 style={ this.props.style }>Hello { this.props.name }!</h1>);
}
} HelloWorld.defaultProps = {
name: 'Libing'
} export default HelloWorld;
import React from 'react';
import ReactDOM from 'react-dom'; import HelloWorld from './components/HelloWorld' ReactDOM.render(<HelloWorld />, document.getElementById('root'));

1.6 组件样式

  为组件添加样式的方法主要有两种:外部样式表和内联样式。

1.6.1 外部CSS样式表

  样式表引入的两种方式:

  (1)在使用组件的HTML页面中通过标签引入

<link rel="stylesheet" type="text/css" href="style.css" >

  (2)把样式表当作一个模块,在使用该样式表的组件中,导入样式表文件

import './style.css'; // 相对路径

  React元素要使用className代替class作为选择器。

  /src/components/HelloWorld.css

.hello-world {
color: red;
font-size: 14px;
}

  /src/components/HelloWorld.js

import React from 'react';

import './HelloWorld.css';

class HelloWorld extends React.Component {
render(){
return (<h1 className='hello-world'>Hello World!</h1>);
}
} export default HelloWorld;

  第一种引入样式表的方式常用于该样式表作为整个应用的所有组件(基础样式表),第二种引入样式表的方式常用于该样式表作用于某个组件(组件的私有样式)。

  全局基础样式表要可以使用第二种方式引入,一般在应用的入口js文件中引入,如index.js。

1.6.2 内联样式

  内联样式是一种CSS in JS的写法:将CSS写到JS文件中,用JS对象表示CSS,通过DOM类型节点的style属性引用样式对象。

import React from 'react';

class HelloWorld extends React.Component {
render(){
return (<h1 style={{
color: 'red',
fontSize: '14px'
}}>Hello World!</h1>);
}
} export default HelloWorld;

  style使用了两个大括号{{}},第一个大括号表示style的值是一个JavaScript表达式,第二个大括号表示这个JavaScript表达式是一个对象。

import React from 'react';

class HelloWorld extends React.Component {
render(){
const style = {
color: 'red',
fontSize: '14px'
}; return (<h1 style={ style }>Hello World!</h1>);
}
} export default HelloWorld;

2. 组件生命周期

React笔记:组件(3)的更多相关文章

  1. React笔记_(3)_react语法2

    React笔记_(3)_react语法2 state和refs props就是在render渲染时,向组件内传递的变量,这个传递是单向的,只能继承下来读取. 如何进行双向传递呢? state (状态机 ...

  2. React 异步组件

    之前写过一篇 Vue 异步组件的文章,最近在做一个简单项目的时候又想用到 React 异步组件,所以简单地了解了一下使用方法,这里做下笔记. 传统的 React 异步组件基本都靠自己实现,自己写一个专 ...

  3. 移动web端的react.js组件化方案

     背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...

  4. Griddle, griddle-react 一个REACT 表格组件

    Griddle, griddle-react 一个REACT 表格组件: http://griddlegriddle.github.io/Griddle/index.html

  5. React Native组件之Text

    React Native组件之Text相当于iOS中的UILabel. 其基本属性如下: /** * Sample React Native App * https://github.com/face ...

  6. React Native组件之Switch和Picker和Slide

    React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性 ...

  7. reactjs入门到实战(七)---- React的组件的生命周期

    React的组件的生命周期有三个状态分别是:挂载(生产组件示例化.准备挂载到页面.挂载到页面).更新(更新值.更新DOM).和卸载(卸载后). >>>其他     getInitia ...

  8. React Native 组件之TextInput

    React Native 组件之TextInput类似于iOS中的UITextView或者UITextField,是作为一个文字输入的组件,下面的TextInput的用法和相关属性. /** * Sa ...

  9. React的组件用法

    React.createClass() 中文翻译 https://discountry.github.io/react/3.4K ( https://doc.react-china.org868 ) ...

随机推荐

  1. spring-security实现的token授权

    在我的用户密码授权文章里介绍了spring-security的工作过程,不了解的同学,可以先看看用户密码授权这篇文章,在 用户密码授权模式里,主要是通过一个登陆页进行授权,然后把授权对象写到sessi ...

  2. springboot~mongo内嵌集合的操作

    对于mongodb的内嵌对象的各种操作大叔在.net平台时已经说过,同时大叔也自己封装过mongo的仓储,使用也都很方便,而在java springboot框架里当然也有对应的方法,下面主要说一下,希 ...

  3. 前端笔记之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链

    一.对象(Object) 1.1 认识对象 对象在JS中狭义对象.广义对象两种. 广义:相当于宏观概念,是狭义内容的升华,高度的提升,范围的拓展.狭义:相当于微观概念,什么是“狭”?因为内容狭隘具体, ...

  4. 初探Parcel

    昨天趁有点时间看了前不久很火的构建工具Parcel,这里说下初步使用的感受,尤其是将其放到实际项目中和Webpack进行比较. 一.前言 首先说下笔者目前的技术栈.最近的前端项目主要以管理后台为主,技 ...

  5. Python:bs4的使用

    概述 bs4 全名 BeautifulSoup,是编写 python 爬虫常用库之一,主要用来解析 html 标签. 一.初始化 from bs4 import BeautifulSoup soup ...

  6. [翻译] GCC 内联汇编 HOWTO

    目录 GCC 内联汇编 HOWTO 原文链接与说明 1. 简介 1.1 版权许可 1.2 反馈校正 1.3 致谢 2. 概览 3. GCC 汇编语法 4. 基本内联 5. 扩展汇编 5.1 汇编程序模 ...

  7. 如何探测网络设备ACL规则

    探测网络设备ACL规则 背景:在互联网企业的生产网络中,往往在网络入口处的网络设备上会有成千上万条ACL策略,这么多的ACL导致了网络管理员很难彻底梳理清楚其中的逻辑关系,从而不知道到底对外开放了哪些 ...

  8. Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

    最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一 ...

  9. C#实现.ini文件读写操作

    1.ini文件是什么?        见百度百科:https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=aladdin 2.C#语 ...

  10. Django学习之六:Django 常用模块导入记忆

    Django 常用模块导入记忆 django相关 1. urls相关操作 from django.urls import path, re_path, include from django.urls ...