关于React总结
一 :React 介绍
1.1:什么是react
react是用来构建用户界面的JavaScript库,vc很多人认为是react是MVC中的v(视图)。
1.2:React 的特点
- 高效
- 灵活
- Jsx
- 单项数据流
- 声明范式编写方式
- 组件化开发
1.3:React 的优点
- 它提高了应用的性能 可以方便地在客户端和服务器端使用 由于 JSX,代码的可读性很好 React很容易与 Meteor,Angular 等其他框架集成 使用React,编写UI测试用例变得非常容易。
- React组件化开发,使用ES6的语法来自定义复杂的标签(组件),很多实现某些功能的自定义组装在一起,就可以完成更复杂的UI界面
二:es6
2.1:let新特性
不存在变量提升
暂时性死区
不允许重复声明
块级作用域
2.2:const新特性
不存在变量提升
暂时性死区
不允许重复声明
块级作用域
声明的变量不允许重新赋值
声明必须有初始化值
2.2:let与const区别
Let: 不存在变量提升
不允许重复声明
块级作用域
三:组件的介绍
3.1:什么是组件
一个应用/版块/页面中用于实现某个局部的功能(包括html, js, css等)
把这些局部功能组装到一起,就形成组件
3.2:组件的类型
组件分为有状态组件和无状态组件 无状态组件就是函数组件 有状态组件是类组件 区别在于是否含有state属性 下面给大家详细介绍一下有状态组件
3.2.1:有状态组件(class组件)
//先引入react
import React, { Component } from 'react'
//声明一个类组件
export class Footer extends Component {
//重新渲染到页面
render() {
//返回值
return (
<div>
</div>
)
}
}//class组件默认有state属性
//抛出
export default Footer
-
在类组件中 声明变量时,要把所有的变量都放到state对象中
-
放在state对象中 一是为了方便规范 ,二是标识符的规范 三是使用setstate实时更新数据
-
类组件中声明的函数 this指向问题 可以用箭头函数解决 也可以用bind(this)
-
操作渲染的DOM元素,使用ref属性 用this.refs.属性名 来获取值
3.2.2:无状态组件(函数组件)
//先引入react
import React, { Component } from 'react'
//声明一个函数组件
function Footer(){
render() {
//返回值
return (
<div>
</div>
)
}
}
//抛出
export default Footer;
3.3:组件之间的关系
- 父子组件
- 兄弟组件
3.4:组件之间的通信 传值
3.4.1 父传子
父组件 --> 子组件 props属性
F.js 调用了 S.js , S.js中的数据是由 F.js决定的 通过标签(组件)的属性传值
F.js 引入 S.js
class F{
<S 属性=值>
}
S.js {this.props.属性}
父组件代码示例如下:
//父组件里面写的函数
// 类组件
// 先引入模块
import React from 'react';
import User from './User';
// 声明类
class Person extends React.Component{
// 重写渲染方法
render(){
return(
<div className='div'>
<div>hello person</div>
<User str='1'></User>
</div>
);
};
};
// 向外暴露
export default Person;
子组件代码示例如下:
// 创建一个函数组件
// 首先引用react模块
import React from 'react';
// 声明函数
function User(props){
return(
<div><font>hello user</font>
<p>
{props.str}</p>
</div>
)
}
export default User;
3.4.2 子传父
子组件 --> 父组件
1、在父组件中声明一个函数,用于接收子组件的传值
2、通过组件属性的方法,把函数传递给子组件
3、在子组件中通过props属性调用父组件的函数,并通过参数传值
4、在父组件中的函数通过形参接收子组件的传值
父组件代码示例如下:
// 引用模块
import React from 'react';
import Son from './Son';
// 类函数
class Father extends React.Component{
// 写一个构造方法
message(msg){
console.log(msg)
}
// 重写渲染方法
render(){
return(
<React.Fragment>
<Son mess='hello ' msg={this.message}></Son>
</React.Fragment>
)
}
}
export default Father;
子组件代码示例如下:
import React from 'react';
class Son extends React.Component{
// 重新渲染页面
render(){
//返回值
return(
<React.Fragment>
<p>
{this.props.mess} ,
//传给父组件的值
{this.props.msg(123)}
</p>
</React.Fragment>
)
};
}
// 向外暴露
export default Son;
3.4.3. 兄弟传值
1、在父组件中声明一个函数,用于接收子组件的传值
2、通过组件属性的方法,把函数传递给子组件
3、在子组件中通过props属性调用父组件的函数,并通过参数传值
4、在父组件中的函数通过形参接收子组件的传值
5. 父组件再传给另一个儿子 通过构造方法 this.state接收 再用父传子的方法就可以了
父组件代码示例如下:
import React from 'react';
import Son from './Son';
import Son2 from './Son2';
//父组件
class Father extends React.Component{
constructor(){
super();
this.state = {
message:''
}
}
//用于接收Son.js组件的数据函数
sonDatas(msg){
this.setState({
message:msg
});
console.log("在Father.js中展示Son.js生成的数据:"+msg);
}
render(){
return (
<React.Fragment>
<h1>在Father组件中显示:</h1>
<Son sondata={this.sonDatas.bind(this)}></Son>
<Son2 mess={this.state.message}></Son2>
</React.Fragment>
);
}
}
export default Father;
子组件1代码示例如下:
import React from 'react';
//子组件
class Son extends React.Component{
//按钮点击事件函数
sonClick(){
this.props.sondata('这是从Son.js中生成的数据。。。');
}
render(){
return (
<React.Fragment>
<button onClick={this.sonClick.bind(this)}>Son组件中的按钮获取数据</button>
</React.Fragment>
);
}
}
export default Son;
子组件2代码示例如下:
import React from 'react';
//子组件
class Son2 extends React.Component{
render(){
return (
<React.Fragment>
<h1>
在Son2.js中展示Son.js中生成的数据,这个是Father.js传过来的,数据是:
{this.props.mess}
</h1>
</React.Fragment>
);
}
}
export default Son2;
四 refs属性介绍
在React数据流中,父子组件唯一的交流方式是通过props属性;如果要修改子组件,通过修改父组件的属性,更新达到子组件props属性的值,重新渲染组件以达到视图的更新。但是,有些场景需要获取某一个真实的DOM元素来交互,比如文本框的聚焦、触发强制动画等
- 给DOM元素添加ref属性
- 给类组件添加ref属性
子组件2代码示例如下:
import React from 'react';
import ReactDOM from 'react-dom';
class Person extends React.Component{
constructor(){
super();
this.handleClick = this.handleClick.bind(this);
}
//点击事件
handleClick(){
// 使用原生的 DOM API 获取焦点
this.refs.myInput.focus();
}
render(){
return (
<div>
<input type="text" ref="myInput" />
<input
type="button"
value="点我输入框获取焦点"
onClick={this.handleClick}/>
</div>
);
}
}
ReactDOM.render(<Person />, document.getElementById('root'));
五 :路由之间的跳转
5.1 安装react-router-dom
*要注意:以下所有操作均运行在搭好的React环境中
cnpm install react-router-dom -S
5.2 引入路由相关组件
引入内置组件
- HashRouter表示一个路由的根容器,将来所有的路由相关的东西,都要包裹在HashRouter里面,而且一个网站中,只需要使用一次HashRouter就好了;
- Route表示一个路由规则,在Route上,有两个比较重要的属性,path,component
- Link表示一个路由的链接
代码示例如下:
import {HashRouter,Route,Link} from 'react-router-dom'
5.3嵌套路由
5.3.1 入口文件 代码示例:
import React from 'react';
//先引入要用到的路由 链接
import {HashRouter,Route,Link} from 'react-router-dom';
import News from './News'
//声明一个类组件
class App extends React.Component{
//从新渲染页面
render(){
return(
// 根容器
<HashRouter>
<div>
<h2>我想吃肉</h2>
<hr />
{/* 链接 */}
<Link to='/News'>新闻</Link>
<Route path='/News' component={News}></Route>
</div>
</HashRouter>
)}
}
//向外暴露
export default App;
5.3.2 一级路由 代码示例:
//引入要用到的路由 链接
import React from 'react';
import Pig from './news/pig'
import {Route,Link} from 'react-router-dom';
//声明一个类组件
class News extends React.Component
{
//重新渲染页面
render(){
return(
<div>
//link里面的to指的是去某个页面
<Link to='/news/pig'>你怕是个憨憨</Link>
//在这里的陆晶晶跳转的是news里面的pig组件
<Route path='/news/pig' component={Pig}></Route>
</div>
)
}
}
//向外暴露
export default News;
5.3.3 二级路由 代码示例:
代码示例如下:
import React from 'react';
//声明一个类组件
class pig extends React.Component{
//重新渲染页面
render(){
return(
<div>哈哈哈哈哈</div>
)
}
}
//向外暴露
export default pig;
六 redux介绍
6.1什么是redux
Redux是一个流行的JavaScript框架,为应用程序提供一个可预测的状态容器。Redux基于简化版本的Flux框架,Flux是Facebook开发的一个框架。在标准的MVC框架中,数据可以在UI组件和存储之间双向流动,而Redux严格限制了数据只能在一个方向上流动
6.2:配置Redux
npm install redux
创建store目录,在store目录下新建index.js文件,键入以下内容:
import {createStore} from 'redux';
import reducer from './reducer';
const store = createStore(reducer);
export default store;
在store目录下创建reducer.js文件,键入以下内容:
const defaultState = {
inputValue:'',
list:[]
}
//reducer可以接收state,但是不能修改state
export default (state = defaultState,action) => {
return state;
}
在组件中就可以使用store的数据
import React,{Component} from 'react';
import store from './store/index';
class TodoList extends Component{
constructor(props){
super(props);
this.state = store.getState();
this.handleStoreChange = this.handleStoreChange.bind(this);
store.subscribe(this.handleStoreChange);
}
handleStoreChange(){
this.setState(store.getState());
}
render(){
return (
<div>
<input type='text' value={this.state.inputValue}/>
<button onClick={this.handleClick}>提交</button>
<ul>
{this.state.list.map((item,index)=>{
return (
<li key={index}>{item}</li>
);
})}
</ul>
</div>
);
}
}
export default TodoList;
*结束了。。。看完了这些 你是否对react有了新的认识 加油哦