您现在的位置是:首页 >其他 >与react的初定情素网站首页其他
与react的初定情素
前要: 其实吧!之前的博客基本没有写过相关react的笔记,因为我根本没有写过react的相关项目,作为一个小水前端,没有写过react的项目会让别人笑大大牙的,所以趁着划水时间好好学习,天天向上!
React 是一个用于构建用户界面的 JAVASCRIPT 库。主要用于构建 UI,很多人认为 React 是 MVC 中的 V(视图)。起源于 Facebook 的内部项目,用来架设 Instagram 的网站。拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。经过vue岁月的磨洗,直接上脚手架把!
尝试修改 src/App.js 文件代码
import React,{ Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>Edit <code>src/App.js</code> and save to reload.</p>
<a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" >
Learn React
</a>
</header>
</div>
)
}
}
export default App;
开局报错,幸运!
ERROR in Failed to load plugin ‘flowtype‘ declared in ‘package.json » eslint-config-react-app‘
项目中建.eslintrc.json - 遵循的eslink规则
react没暴露webpack的配置,但webpack中有一个配置是写死的,需要一个用户自己的eslink规则
文件内容可以为{},也可以自己定义一套规则
JSX
React 使用 JSX 来替代常规的 JavaScript。JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。
JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
它是类型安全的,在编译过程中就能发现错误。
使用 JSX 编写模板更加简单快速。
所以推荐使用JSX来编写逻辑会更好!!!
我们知道元素是构成 React 应用的最小单位,JSX 就是用来声明 React 当中的元素。与浏览器的 DOM 元素不同,React 当中的元素事实上是普通的对象,React DOM 可以确保 浏览器 DOM 的数据内容与 React 元素保持一致。要将 React 元素渲染到根 DOM 节点中,我们通过把它们都传递给 ReactDOM.render() 的方法来将其渲染到页面上:
JSX表达式
import React ,{Component} from 'react'
import './Hello.css'
export default class Hello extends Component{
render (){
return <h1>{2+3}</h1>
}
}
JSX 不能使用 if else ,但可使用三元运算表达式替代
import React ,{Component} from 'react'
import './Hello.css'
export default class Hello extends Component{
render (){
let i = 1;
return <h1>{i == 1 ? 'True!' : 'False'}</h1>
}
}
JSX样式
React 推荐使用内联样式。使用 camelCase 语法来设置内联样式. React 会在指定元素数字后自动添加 px 。为 h1 元素添加 myStyle 内联样式:
import React ,{Component} from 'react'
import './Hello.css'
export default class Hello extends Component{
render (){
var myStyle = {
fontSize: 100,
color: '#FF0000'
};
return <h1 style = {myStyle}>hell word!</h1>
}
}
JSX数组
JSX 允许在模板中插入数组,数组会自动展开所有成员:
import React ,{Component} from 'react'
import './Hello.css'
export default class Hello extends Component{
render (){
var arr = [
<h1>hell word</h1>,
<h2>努力学习react!</h2>,
];
return <h1>{arr}</h1>
}
}
组件
state状态
React 把组件看成一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
React 里,只需更新组件的state,然后根据新 state 重新渲染用户界面(不要操作 DOM)。
以下实例创建一个名称扩展为 React.Component 的 ES6 类,在 render() 方法中使用 this.state 来修改当前的时间。添加一个类构造函数来初始化状态 this.state,类组件应始终使用 props 调用基础构造函数。
import React ,{Component} from 'react'
import './Hello.css'
export default class Hello extends Component{
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render (){
return (
<h1>hell word</h1>,
<h2>{this.state.date.toLocaleTimeString()}</h2>
)
}
}
我们将Clock设置自己的计时器并每秒更新一次。
将生命周期方法添加到类中
在具有许多组件的应用程序中,在销毁时释放组件所占用的资源非常重要。
每当 Clock 组件第一次加载到 DOM 中的时候,我们都想生成定时器,这在 React 中被称为挂载。
同样,每当 Clock 生成的这个 DOM 被移除的时候,我们也会想要清除定时器,这在 React 中被称为卸载。
我们可以在组件类上声明特殊的方法,当组件挂载或卸载时,来运行一些代码:
import React ,{Component} from 'react'
import './Hello.css'
export default class Hello extends Component{
//构造函数,初始化state状态值
constructor(props) {
super(props);
this.state = {date: new Date()};
}
//首次渲染前清除所有的定时器
componentWillUnmount() {
clearInterval(this.timerID);
}
//render渲染之后定时0.1秒执行tick方法的操作
componentDidMount() {
this.timerID = setInterval(
() => this.tick,100
);
}
//更新日期的方法
tick() {
this.setState({
date: new Date()
});
}
//渲染组件
render (){
return (
<h1>hell word</h1>,
<h2>{this.state.date.toLocaleTimeString()}</h2>
)
}
}
Props
state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据。
以下实例创建一个 Mytitle 组件,属性 title 是必须的且是字符串,非字符串类型会自动转换为字符串 :
var title = "小瓜皮";
// var title = 123;
class MyTitle extends React.Component {
render() {
return (
<h1>Hello, {this.props.title}</h1>
);
}
}
MyTitle.propTypes = {
title: PropTypes.string
};
ReactDOM.render(
<MyTitle title={title} />,
document.getElementById('example')
);
Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。
事件处理
//HTML 通常写法是:
<button onclick="activateLasers()">
激活按钮
</button>
//React 中写法为:
class LoggingButton extends React.Component {
// 这个语法确保了 `this` 绑定在 activateLasers中
// 这里只是一个测试
activateLasers= () => {
console.log('this is:', this);
}
render() {
return (
<button onClick={this.activateLasers}>
激活按钮
</button>
);
}
}
必须谨慎对待 JSX 回调函数中的 this,类的方法默认是不会绑定 this 的。如果你忘记绑定 this.activateLasers并把它传入 onClick, 当你调用这个函数的时候 this 的值会是 undefined。
条件渲染
React 中的条件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI。
//两个组件
function UserGreeting(props) {
return <h1>欢迎回来!</h1>;
}
function GuestGreeting(props) {
return <h1>请先注册。</h1>;
}
创建一个 Greeting 组件,它会根据用户是否登录来显示其中之一:
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
ReactDOM.render(
// 尝试修改 isLoggedIn={true}:
<Greeting isLoggedIn={false} />,
document.getElementById('example')
);
列表 & Keys
使用 map() 方法遍历数组生成了一个 1 到 5 的数字列表:,组件接收数组参数,每个列表元素分配一个 key,不然会出现警告 a key should be provided for list items,意思就是需要包含 key:
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<li key={number.toString()}>
{number}
</li>
);
return (
<ul>{listItems}</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('example')
);
React 组件生命周期
组件的生命周期可分成三个状态:
- Mounting(挂载):已插入真实 DOM
- Updating(更新):正在被重新渲染
- Unmounting(卸载):已移出真实 DOM
class Button extends React.Component {
constructor(props) {
super(props);
this.state = {data: 0};
this.setNewNumber = this.setNewNumber.bind(this);
}
setNewNumber() {
this.setState({data: this.state.data + 1})
}
render() {
return (
<div>
<button onClick = {this.setNewNumber}>INCREMENT</button>
<Content myNumber = {this.state.data}></Content>
</div>
);
}
}
class Content extends React.Component {
componentWillMount() {
console.log('Component WILL MOUNT!')
}
componentDidMount() {
console.log('Component DID MOUNT!')
}
componentWillReceiveProps(newProps) {
console.log('Component WILL RECEIVE PROPS!')
}
shouldComponentUpdate(newProps, newState) {
return true;
}
componentWillUpdate(nextProps, nextState) {
console.log('Component WILL UPDATE!');
}
componentDidUpdate(prevProps, prevState) {
console.log('Component DID UPDATE!')
}
componentWillUnmount() {
console.log('Component WILL UNMOUNT!')
}
render() {
return (
<div>
<h3>{this.props.myNumber}</h3>
</div>
);
}
}
ReactDOM.render(
<div>
<Button />
</div>,
document.getElementById('example')
);
挂载
当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下:
constructor(): 在 React 组件挂载之前,会调用它的构造函数。
getDerivedStateFromProps(): 在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。
render(): render() 方法是 class 组件中唯一必须实现的方法。
componentDidMount(): 在组件挂载后(插入 DOM 树中)立即调用。
render() 方法是 class 组件中唯一必须实现的方法,其他方法可以根据自己的需要来实现。
更新
每当组件的 state 或 props 发生变化时,组件就会更新。
当组件的 props 或 state 发生变化时会触发更新。组件更新的生命周期调用顺序如下:
getDerivedStateFromProps(): 在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。根据 shouldComponentUpdate() 的返回值,判断 React 组件的输出是否受当前 state 或 props 更改的影响。
shouldComponentUpdate():当 props 或 state 发生变化时,shouldComponentUpdate() 会在渲染执行之前被调用。
render(): render() 方法是 class 组件中唯一必须实现的方法。
getSnapshotBeforeUpdate(): 在最近一次渲染输出(提交到 DOM 节点)之前调用。
componentDidUpdate(): 在更新后会被立即调用。
render() 方法是 class 组件中唯一必须实现的方法,其他方法可以根据自己的需要来实现。
卸载
当组件从 DOM 中移除时会调用如下方法:
componentWillUnmount(): 在组件卸载及销毁之前直接调用。