01虚拟dom的两种创建方式
- 使用jsx语法创建
- 使用react接口创建
- 接口:React.creatElement(id,attribute,innerContent)
例1-1:使用jsx语法创建
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>1_使用jsx创建虚拟DOM</title>
</head>
<body>
<!-- 准备好一个“容器” -->
<div id="test"></div>
<!-- 引入react核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel" > /* 此处一定要写babel */
//1.创建虚拟DOM
const VDOM = ( /* 此处一定不要写引号,因为不是字符串 */
<h1 id="title">
<span>Hello,React</span>
</h1>
)
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM,document.getElementById('test'))
</script>
</body>
</html>
例1-2:使用react接口创建
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>2_使用js创建虚拟DOM</title>
</head>
<body>
<!-- 准备好一个“容器” -->
<div id="test"></div>
<!-- 引入react核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<script type="text/javascript" >
//1.创建虚拟DOM
const VDOM = React.createElement('h1',{id:'title'},React.createElement('span',{},'Hello,React'))
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM,document.getElementById('test'))
</script>
</body>
</html>
02jsx语法规则
【规则】:
- 定义虚拟dom,非字符串。类似html模板
- Mustache语法是 {}
- class属性对应为className
- 只有一个根标签
- 须有babel.js库将jsx语法转化为js语法
- 自定义组件标签大写,非自定义小写
- 事件如onClick需转为小写,onclick
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsx语法规则</title>
<style>
.title{
background-color: orange;
width: 200px;
}
</style>
</head>
<body>
<!-- 准备好一个“容器” -->
<div id="app"></div>
<!-- 引入react核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel" >
const text = 'Hellow React'
//1.创建虚拟DOM
const VDOM = (
<div style={{width:'500px',height:'300px',backgroundColor:'black',margin:'0 auto'}}>
<h1 style={{color:'white',textAlign:'center' ,lineHeight:'300px'}}>{text}</h1>
</div>
)
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM,document.getElementById('app'))
</script>
03定义组件
` 1)需要继承React.Component
2)必须定义render函数
`
例3-1:函数式定义组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>函数式定义组件</title>
</head>
<body>
<!-- 准备好一个“容器” -->
<div id="app"></div>
<!-- 引入react核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<script type="text/babel" >
//1.创建一个函数需要返回模板
function MyComponent(){
return
<h1>hllow react</h1>
}
//2.渲染虚拟组件到页面
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
</script>
</body>
</html>
例3-2:类继承式定义组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>state简写方式</title>
</head>
<body>
<!-- 准备好一个“容器” -->
<div id="test"></div>
<!-- 引入react核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
//1.创建组件
class PostList extends React.Component{
constructor(props){
super(props)
}
render(){
return(
<ul>
<li>123456</li>
<li>123456</li>
<li>123456</li>
<li>123456</li>
</ul>
)
}
}
ReactDOM.render(<PostList/>,document.getElementById('test'))
</script>
</body>
</html>
3-1状态管理
- 属性:state
- 相关接口:setStates() 调用该方法之后会再调用render方法渲染页面
- 正确修改state
【注意】
- 如何正确使用state
- 这个变量是否通过props从父组件获取?
- 是否在组件整个生命周期中都保持不变?
- 是否在render方法中使用?
- state与不可变对象
--- 需要使用setState()Api
--- React官方建议把state当作不可比变对象,state包含的所有状态都应该是不可变对象当state的某个状态发生变化时应该重新创建
1)状态的类型是不可变(数字,字符串,布尔值,null,undefined)
2) 状态类型是数组时:可以使用数组的concat的方法或者es6的数组扩展语法, slice方法 filter等方法
3)状态类型是对象时:Es6的Object.assgin方法,对象扩展语法
---
3-2props属性(父子组件通信)
- 可以是函数
- 属性校验和默认值
- React提供了PropTypes对象 用于校验组件属性的类型
- 类型限制---- 可以提供propTypes类属性进行限制(用键值对表示)
- 必须限制---- isRequired
- 默认设置---- 提供defaultProps类属性 | 对应类型 | | | --- | --- | | js| PropTypes | |String | PropTypes.string| |Number |PropTypes.Number| |Boolean|PropTypes.bool| |Function|PropTypes.func| |Object|PropTypes.object| |Array|PropTypes.array|
3-3 特殊的ref
- 使用场景
- 管理焦点,文本选择,或者媒体播放
- 触发动画命名
- 与第三方DOM库集成
- 使用方式
- 使用字符串 不推荐使用
- 使用回调函数
- 使用 React.createRef()
3-4 子组件向父组件通信
- 方式:使用props向子组件中传入函数
方式1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="app"></div>
<script type='text/babel'>
class PostItem extends React.Component{
static propsType = {
post:PropsType.object.isRequired,
onVote:PropsType.fun
}
constructor(props){
super(props)
}
render(){
const handleClick = ()=>{
this.props.onVote(this.props.post.id)
}
const {post} = this.props
return (
<li>
<p><a href='#'>{post.title}</a></p>
<div>创建人:<span>{post.author}</span></div>
<div>创建时间:<span>{post.date}</span></div>
<button onClick={handleClick}>攒:{post.vote}</button>
</li>
)
}
}
class PostList extends React.Component{
constructor(props){
super(props)
this.state = {posts:[]}
this.timer = null
}
componentDidMount(){
this.timer = setTimeout(
()=>{
this.setState(
{'posts':
[
{title:'全国人口141178万',author:'人m报',date:'2021-5-11 11:22',vote:5},
{title:'全国人口141178万',author:'人m报',date:'2021-5-11 11:22',vote:6},
{title:'全国人口141178万',author:'人m报',date:'2021-5-11 11:22',vote:7}
]
})
},1000)
}
handleVote = id=>{
const posts = this.state.posts.map(function(item){
const newItem = item.id ===id ? {...item,vote:++item.vote} : item
return newItem
})
this.setState({posts})
}
render(){
return(
<div>
<ul>
{this.state.posts.map(item=>{
return <PostItem post = {item} onVote = {this.handleVote}></PostItem>
})}
</ul>
</div>
)
}
}
ReactDOM.render(<PostList></PostList>,document.getElementById('app'))
</script>
</body>
</html>
3-5组件生命周期
- 旧生命周期(16版本以前)
2.新生命周期