2022-03-03
阅读:13
相关js库
创建虚拟DOM的两种方式
JSX语法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//创建虚拟Dom
const VDom = <h1 id="hello">Hello,React</h1>;
//渲染虚拟Dom到页面
ReactDOM.render(VDom,document.getElementById('app'))
console.log(VDom)
</script>
</body>
</html>
js方式(一般不用)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script>
//创建虚拟Dom
const VDom = React.createElement('h1',{id:'title'},'Hello,React')
//渲染虚拟Dom到页面
ReactDOM.render(VDom,document.getElementById('app'))
console.log(VDom)
</script>
</body>
</html>
全程是:Javascript XML
react定义的一种类似于XML的JS扩展语法:js+XML
本质是 React.createElement(component,props,...children)方法的语法糖
作用:用来简化创建虚拟DOM
const VDom = <h1>Hello,React</h1>
标签名任意:HTML标签或其他标签
jsx语法规则
定义虚拟dom时,不要写引号
标签中混入js表达式时,要用{}
样式类名指定不要用class,要用className
内联样式,要用 style={{key:value}}的形式去写,并且需要用小驼峰方式
只有一个根标签
标签必须闭合
标签首字母
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
<style>
.title{
color:orange;
}
</style>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//创建虚拟Dom
const VDom = (
<div>
<h1 className="title" style={{background:'red',fontSize:'30px'}}>
<span>Hello,React</span>
</h1>
<good>123</good>
</div>
)
//渲染虚拟Dom到页面
ReactDOM.render(VDom,document.getElementById('app'))
console.log(VDom)
</script>
</body>
</html>
当应用的js都以模块来编写,这个应用就是一个模块化的应用
当应用是以多组件的方式实现,这个应用就是一个组件化的应用
函数式组件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//创建函数式组件
function MyComponent(){
return <h2>函数式组件</h2>
}
//渲染组件到页面
ReactDOM.render(<MyComponent />,document.getElementById('app'))
</script>
</body>
</html>
类式组件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//创建类式组件
class MyComponent extends React.Component{
render(){
return (
<div>
我是类式组件
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<MyComponent />,document.getElementById('app'))
</script>
</body>
</html>
render
方法中的this为组件实例对象<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//创建类式组件
class MyComponent extends React.Component{
state = {count:0}
//自定义方法——要用赋值语句的形式+箭头函数
changeNum = ()=>{
const {count} = this.state
//注意:状态(state) 不可直接更改
//this.state.count = count++ //错误的写法
//状态必须通过setState 修改
this.setState({count:count+1})
}
render(){
const {count} = this.state
console.log('render')
return (
<div onClick={this.changeNum}>
点我加1-----{count}
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<MyComponent />,document.getElementById('app'))
</script>
</body>
</html>
理解
作用
编码
扩展属性 <Person {...person} />
用 ...运算符把对象上的所有属性传递到props上
默认属性值
Person.defaultProps = {
age:18,
sxe:'男'
}
使用 prop-types 库进行限制
Person.propTypes = {
name:PropTypes.string.isRequire,
age:PropTypes.number
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
<style>
.userItem{
margin-bottom: 20px;
border-bottom: 1px solid #cccccc;
}
</style>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//创建组件
class Person extends React.Component {
state = {
userList:[
{id:1,name:'张三',age:20,sex:'男'},
{id:2,name:'李四',age:21,sex:'男'},
{id:3,name:'小红',age:22,sex:'女'},
]
}
render(){
const {userList} = this.state
return (
<div>
<h3>用户列表</h3>
{
userList.map(item=>{
return <UserItem {...item} key={item.id}></UserItem>
})
}
</div>
)
}
}
class UserItem extends React.Component {
render(){
const {name,age,sex} = this.props
return (
<ul className="userItem">
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
//渲染组件到页面
ReactDOM.render(<Person />,document.getElementById('app'))
</script>
</body>
</html>
理解
ref
属性来标识自己使用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
<style>
.userItem{
margin-bottom: 20px;
border-bottom: 1px solid #cccccc;
}
</style>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
class Demo extends React.Component {
//展示左侧输入框的值
showData = ()=>{
this.refs.input1.value = '2222'
}
//显示右侧输入框的数据
showData2 = ()=>{
console.log(this.refs.input2.value)
}
render(){
return (
<div>
<input ref="input1" type="text" placeholder="点击按钮提示数据" />
<button onClick={this.showData}>提示</button>
<input ref="input2" onBlur={this.showData2} type="text" placeholder="失去焦点提示数据" />
</div>
)
}
}
ReactDOM.render(<Demo />,document.getElementById('app'))
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
<style>
.userItem{
margin-bottom: 20px;
border-bottom: 1px solid #cccccc;
}
</style>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
class Demo extends React.Component {
state = {
value1:''
}
getInput1 = ()=>{
this.setState({value1:this.input1.value})
}
saveInput2 = (c)=>{
console.log(c)
this.input2 = c
}
render(){
const {value1} = this.state
return (
<div>
<input ref={c=> {this.input1 = c;console.log(c)}} type="text" placeholder="点击按钮提示数据" />
<button onClick={this.getInput1}>提示</button>
<input ref={this.saveInput2} type="text" placeholder="失去焦点提示数据" />
<p>{value1}</p>
</div>
)
}
}
ReactDOM.render(<Demo />,document.getElementById('app'))
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
<style>
.userItem{
margin-bottom: 20px;
border-bottom: 1px solid #cccccc;
}
</style>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
class Demo extends React.Component {
/*
* React.createRef 调用之后可以返回一个容器,该容器可以存储被ref所标识的节点
* 注意:该容器是“专人专用”
*/
input1 = React.createRef()
getInput1 = ()=>{
console.log(this.input1.current.value)
}
render(){
return (
<div>
<input ref={this.input1} type="text" placeholder="点击按钮提示数据" />
<button onClick={this.getInput1}>提示</button>
<input type="text" placeholder="失去焦点提示数据" />
</div>
)
}
}
ReactDOM.render(<Demo />,document.getElementById('app'))
</script>
</body>
</html>
事件处理
通过 onXXX属性指定事件处理函数(注意大小写)
通过event.target得到发生事件的DOM元素对象 ----- 不要过渡使用ref
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>helloReact</title>
<style>
.userItem{
margin-bottom: 20px;
border-bottom: 1px solid #cccccc;
}
</style>
</head>
<body>
<!-- 容器 -->
<div id="app"></div>
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
class Login extends React.Component {
//初始化状态
state = {
username:'',
password:'',
}
handleSub = (e)=>{
e.preventDefault()
}
//保存用户名
saveUserName = (e)=>{
this.setState({username:e.target.value})
}
//保存密码
savePassword = (e)=>{
this.setState({password:e.target.value})
}
render(){
return (
<form onSubmit={this.handleSub}>
用户名:<input onChange={this.saveUserName} type="text" name="username" />
密码:<input onChange={this.savePassword} type="password" name="password" />
<button>登陆</button>
</form>
)
}
}
ReactDOM.render(<Login />,document.getElementById('app'))
</script>
</body>
</html>
初始化阶段
不建议使用