1、props基本写法
和vue里面的props很像,这里直接从组件的标签属性中往组件属性中传值,建立起了组件和外部的通讯。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//1、创建组件
class Person extends React.Component{
render(){
const {name,age,gender}=this.props
return (
<ul>
<li>姓名:{name}</li>
<li>年龄:{age}</li>
<li>性别:{gender}</li>
</ul>)
}
}
//2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
ReactDOM.render(<Person name="zhangsanfeng" age='34' gender='female'/>,document.getElementById('test'))
</script>
</body>
</html>
2、给props设置数据规则
使用propTypes来设定
具体规则是react内置的规则:React.PropType.string等等(16的版本以后被弃用)16版本以前放在prop-types.js里,需要引包
对应必填的可以使用链式语法
对于默认值使用类.defaultProps={}的形式来写
prop是只读的,不可以写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//1、创建组件
class Person extends React.Component{
render(){
const {name,age,gender}=this.props
return (
<ul>
<li>姓名:{name}</li>
<li>年龄:{age}</li>
<li>性别:{gender}</li>
</ul>)
}
}
Person.propTypes={
name:PropTypes.string.isRequired,//指定姓名为字符串且必须
gender:PropTypes.string,
age:PropTypes.number,
speak:PropTypes.func//func是函数的意思,这里不用function是因为它是关键字,另外,speak我没在虚拟dom里面传属性
}
Person.defaultProps={
gender:'gonggong',
age:18
}
const p={name:'zhangsan',age:34,gender:'female'}
//2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
//这里使用扩展运算符展开了p对象,注意,这个三点展开不是js的原生运算,是react特有的
ReactDOM.render(<Person {...p}/>,document.getElementById('test'))
</script>
</body>
</html>
实际propType和defaultProps都可以以静态属性的形式写在类内部。这样避免了在类外部定义属性。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//1、创建组件
class Person extends React.Component{
static propTypes={
name:PropTypes.string.isRequired,//指定姓名为字符串且必须
gender:PropTypes.string,
age:PropTypes.number,
speak:PropTypes.func//func是函数的意思,这里不用function是因为它是关键字,另外,speak我没在虚拟dom里面传属性
}
static defaultProps={
gender:'gonggong',
age:18
}
render(){
const {name,age,gender}=this.props
return (
<ul>
<li>姓名:{name}</li>
<li>年龄:{age}</li>
<li>性别:{gender}</li>
</ul>)
}
}
const p={name:'zhangsan',age:34,gender:'female'}
//2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
//这里使用扩展运算符展开了p对象,注意,这个三点展开不是js的原生运算,是react特有的
ReactDOM.render(<Person {...p}/>,document.getElementById('test'))
</script>
</body>
</html>
3、函数式组件使用props
直接对函数的形参传入props就行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//1、创建组件
class Person extends React.Component{
constructor (props) {
super(props);
}
static propTypes={
name:PropTypes.string.isRequired,//指定姓名为字符串且必须
gender:PropTypes.string,
age:PropTypes.number,
speak:PropTypes.func//func是函数的意思,这里不用function是因为它是关键字,另外,speak我没在虚拟dom里面传属性
}
static defaultProps={
gender:'gonggong',
age:18
}
render(){
const {name,age,gender}=this.props
return (
<ul>
<li>姓名:{name}</li>
<li>年龄:{age}</li>
<li>性别:{gender}</li>
</ul>)
}
}
//函数式组件接收props
function NewPerson(props){
const {name,age,gender}=props
return (
<ul>
<li>name:{name}</li>
<li>age:{age}</li>
<li>gender:{gender}</li>
</ul>
)
}
NewPerson.prototypes={
name:PropTypes.string.isRequired,//指定姓名为字符串且必须
gender:PropTypes.string,
age:PropTypes.number
}
NewPerson.defaultProps={
gender:'gonggong',
age:18
}
//2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
//这里使用扩展运算符展开了p对象,注意,这个三点展开不是js的原生运算,是react特有的
ReactDOM.render(<Person name="zhangsan"/>,document.getElementById('test'))
ReactDOM.render(<NewPerson name="lisi" gender="male"/>,document.getElementById('test'))
</script>
</body>
</html>
4、字符串形式的ref(不被推荐)
组件内的标签可以定义ref属性来标识自己
ref值{key:value}对应组件标签中的键值对,其中key对应组件标签ref的值,value对应当前节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//创建类组件
class MyComponent extends React.Component{
//使用赋值及箭头函数的形式来避免this指向错误
showleft=()=>{
const {inputLeft}=this.refs
console.log(inputLeft.value)
}
showright=()=>{
const {inputRight}=this.refs
console.log(inputRight.value)
}
render(){
return (
<div>
<input type="text" ref="inputLeft" placeholder="please input something"/>
<input type="button" onClick={this.showleft} value="弹出"/>
<input type="text" ref="inputRight" onBlur={this.showright} placeholder="please input somthing"/>
</div>
)
}
}
//渲染组件
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
</script>
</body>
</html>
5、回调形式的ref
ref={回调函数}//注意是回调函数,不是回调函数名
这个箭头函数的参数就是当前节点
在函数体内对ref的值进行命名
这个回调函数由react来调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//创建类组件
class MyComponent extends React.Component{
//使用赋值及箭头函数的形式来避免this指向错误
showleft=()=>{
const {inputLeft}=this
console.log(inputLeft.value)
}
showright=()=>{
const {inputRight}=this
console.log(inputRight.value)
}
render(){
//ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
return (
<div>
<input type="text" ref={(currentNode)=>{this.inputLeft=currentNode}} placeholder="please input something"/>
<input type="button" onClick={this.showleft} value="弹出"/>
<input type="text" ref={(currentNode)=>{this.inputRight=currentNode}} onBlur={this.showright} placeholder="please input somthing"/>
</div>
)
}
}
//渲染组件
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
</script>
</body>
</html>
- //ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
- //注意:在内联调用下,回调会执行两次,一次是传null,第二次才传入当前节点
- 要避免这么使用的话则使用类调用的形式
- jax注释使用{/**/}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//创建类组件
class MyComponent extends React.Component{
state={ishot:true,wind: '微风'}
//使用赋值及箭头函数的形式来避免this指向错误
showleft=()=>{
const {inputLeft}=this
console.log(inputLeft.value)
}
showright=()=>{
const {inputRight}=this
console.log(inputRight.value)
}
changeWeather=()=>{
const {ishot}=this.state
//
this.setState({ishot:!ishot})
}
saveinput=(currentNode)=>{
this.inputLeft=currentNode
console.log('@',currentNode)
}
render(){
//ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
//注意:在内联调用下,回调会执行两次,一次是传null,第二次才传入当前节点
//建议写成内联的
const {ishot}=this.state
return (
<div>
<h1>今天天气很{ishot?'炎热':'凉爽'}</h1>
<button onClick={this.changeWeather}>点我切换天气</button>
{/*<input type="text" ref={(currentNode)=>{this.inputLeft=currentNode;
console.log('@',currentNode)}} placeholder="please input something"/>*/}
<input ref={this.saveinput} type="text"/>
<input type="button" onClick={this.showleft} value="弹出"/>
<input type="text" ref={(currentNode)=>{this.inputRight=currentNode}} onBlur={this.showright} placeholder="please input somthing"/>
</div>
)
}
}
//渲染组件
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
</script>
</body>
</html>
6、creatRef的使用
- React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点
- 该容器专人专用,只能使用一份,所以需要创建另外一个容器
- 目前这种形式是最被推荐的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>
<!-- 下面不能默认写默认js,必须写type并且是bable,实际是jax -->
<script type="text/babel">
//创建类组件
class MyComponent extends React.Component{
myRef=React.createRef()
myRef2=React.createRef()
state={ishot:true,wind: '微风'}
//使用赋值及箭头函数的形式来避免this指向错误
showleft=()=>{
// const {inputLeft}=this
// console.log(inputLeft.value)
console.log(this.myRef.current.value)
}
showright=()=>{
// const {inputRight}=this
// console.log(inputRight.value)
console.log(this.myRef2.current.value)
}
changeWeather=()=>{
const {ishot}=this.state
//
this.setState({ishot:!ishot})
}
saveinput=(currentNode)=>{
this.inputLeft=currentNode
console.log('@',currentNode)
}
render(){
//ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
//注意:在内联调用下,回调会执行两次,一次是传null,第二次才传入当前节点
//建议写成内联的
const {ishot}=this.state
return (
<div>
<h1>今天天气很{ishot?'炎热':'凉爽'}</h1>
<button onClick={this.changeWeather}>点我切换天气</button><br/>
{/*<input type="text" ref={(currentNode)=>{this.inputLeft=currentNode;
console.log('@',currentNode)}} placeholder="please input something"/>*/}
<input ref={this.myRef} type="text"/>
<input type="button" onClick={this.showleft} value="弹出"/><br/>
<input type="text" ref={this.myRef2} onBlur={this.showright} placeholder="please input somthing"/>
</div>
)
}
}
//渲染组件
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
</script>
</body>
</html>