1.声明式设计 −React采用声明范式,可以轻松描述应用。
2.高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。
3.灵活 −React可以与已知的库或框架很好地配合。
4.JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。
5.组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
6.单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。
数据:
vue:双向数据绑定和单向数据流。双向数据绑定:DOM元素绑定的data值,当发生改变后,vue的响应式机制会自动监听data的变化重新渲染。单向数据流:当父组件给子组件传递数据的时候,子组件只可以读取而不能修改数据。可以用watch监听数据的更改,再赋给父组件的变量。
react:单向数据流。DOM元素依赖于state,但改变state不会改变渲染好的DOM,通过setState()才能重新渲染。父组件传值到子组件,如果顶级的props变了,会重新渲染所有的子组件。
虚拟DOM:
vue:计算出虚拟DOM的差异,在渲染的过程中跟踪每个组件的依赖关系,不会重新渲染整个组件树
react:当应用的状态改变时,重新渲染全部子组件,可以通过shouldComponentUpdate生命周期进行优化
模板和jsx:
vue:具有单文件组件,可以把html、css、js写在一个vue文件里----MVVM框架
react:依赖于jsx,在JavaScript中创建DOM----视图层框架
构建工具:
vue:vue-cli
react:create-react-app 项目名
import React from "react";
import {TabBar,TabContent,TabBarItem} from './styled';
import PropTypes from 'prop-types';
export default class Tab extends React.Component{
state={
current:this.props.initPage //初始默认下标
}
//切换事件
onChange=(i)=>()=>{
this.setState({
current:i
})
}
render() {
const {current} = this.state;
return(
{
this.props.tabs.map((item,i)=>(
{item.title}
))
}
{this.props.children}
)
}
}
Tab.propTypes={
tabs:PropTypes.array,
initPage:PropTypes.number
};
Tab.defaultProps = {
tabs:[
{
id:1,
title:"选项一"
},
{
id:2,
title:"选项二"
},
{
id:3,
title:"选项三"
}
],
initPage:0
}
import styled from 'styled-components'; //样式
export const TabBar = styled.div`
width: 100%;
height: 43px;
z-index: 1;
flex-shrink: 0;
display: flex;
position: relative;
.underline {
position: absolute;
width: 33.3333%;
left: 0;
height: 0;
bottom: 0;
border-top: 2px solid #108ee9;
transition: top .3s cubic-bezier(.35,0,.25,1),left .3s cubic-bezier(.35,0,.25,1),color .3s cubic-bezier(.35,0,.25,1),width .3s cubic-bezier(.35,0,.25,1);
will-change: top,left,width,color;
}
`;
export const TabBarItem = styled.div`
width: 33.3333%;
font-size: 15px;
height: 43.5px;
line-height: 43.5px;
border-bottom: 1px solid #ddd;
padding: 8px 0;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
&.active {
color: #108ee9;
}
`;
export const TabContent = styled.div`
transition: transform .3s cubic-bezier(.35,0,.25,1),left .3s cubic-bezier(.35,0,.25,1),top .3s cubic-bezier(.35,0,.25,1),-webkit-transform .3s cubic-bezier(.35,0,.25,1);
will-change: transform,left,top;
display: flex;
flex: 1;
height: 100%;
div {
flex-shrink: 0;
width: 100%;
overflow-y: auto;
}
`;
import React from 'react';
import ReactDOM from 'react-dom';
import Tab from "./components/tab";
ReactDOM.render(
内容1
内容2
内容3
,
document.getElementById('root')
);