props
1. Props传入参数
- props 是组件对外的接口。使用props就可以向组件内部进行数据传递
- 注意:Props对于使用它的组件来说,是只读的。一旦赋值不能修改。也就是说props的值是不可变的只能在渲染的时候传入无法动态赋值。
- 当一个组件被注入Props 值时,属性值来源于它的父级元素,从父级到子元素。
<script src="js/react.16.8.6.js"></script>
<script src="js/react-dom.16.8.6.js"></script>
<script src="js/babel.min.js"></script>
<script src="js/prop-types.js"></script>
<div id="demodiv"></div>
<script type="text/babel">
function Zi(props){
return (
<h1>我是子组件{props.text}++++++++++++{props.name}</h1>
)
}
function Fu(){
return (
<div>
<p>我是父组件</p>
<Zi text="我是调用的数据" name="我是传入的数据"/>
</div>
)
}
ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>
1.1Props传入参数扩展
在参数较多的时候可以把Object类型进行传递
<script type="text/babel">
//为什么要传递进来一个对象,解决子组件中传递多个props的时候传递参数不方便
var obj={
name:"mgd",
age:16,
sex:"男",
phone:18409441016
}
function Fu(props){
return (
<div>
<p>我是父组件</p>
<h1>{props.name}</h1>
<h1>{props.age}</h1>
<h1>{props.sex}</h1>
<h1>{props.phone}</h1>
</div>
)
}
ReactDOM.render(<Fu {...obj}/>,document.getElementById("demodiv"))
</script>
1.2Props默认值
1.用==||==来进行判断
<script type="text/babel">
function Zi(props){
props.text=props.text||"我是子组件的默认值"
return (
<h1>我是子组件{props.text}</h1>
)
}
function Fu(){
var futext="我是父组件的数据5555555"
return (
<div>
<p>我是父组件</p>
<Zi text={futext}/>
</div>
)
}
ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>
2.defaultProps
有些时候, 我们需要设置一些默认属性, 在父级组件未向子级组件传递数据时, 填充默认值。defaultProps
<script type="text/babel">
function Zi(props){
return (
<h1>我是子组件{props.text}++++{props.num}</h1>
)
}
function Fu(){
var futext="我是父组件的数据5555555"
return (
<div>
<p>我是父组件</p>
<Zi text="王大锤"/>
</div>
)
}
//给需要默认值的组件进行默认props的设置
Zi.defaultProps={
text:"么么哒",
num:"木马"
}
ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>
2. Props验证
15.5之前Props验证使用propTypes,它可以保证我们在应用组件的时候可以正确的传递值
注意:自React15.5起,React.PropType已经移入另一个包中,请使用prop-type代替
<script src="js/react.16.8.6.js"></script> <!-- 注意此处引入的包是15.5之后的 -->
<script src="js/react-dom.16.8.6.js"></script> <!-- 注意此处引入的包是15.5之后的 -->
<script src="js/babel.min.js"></script>
<script src="js/prop-types.js"></script>
<script type="text/babel">
function Zi(props){
return (
<h1>我是子组件{props.name}</h1>
)
}
// var num=1;//会报错
function Fu(){
return (
<div>
<p>我是父组件</p>
<Zi name="你好,么么哒"/>
{ /* <Zi name={num}/> */}
</div>
)
}
Zi.propTypes={
name:PropTypes.string.isRequired
}
ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>
3.class类定义方式:传入参数
3.1 传入参数
使用this.props.xx接收值
<script type="text/babel">
class MyCom extends React.Component{
render(){
return (
<div>
<p>我是组件{this.props.name}</p>
</div>
)
}
}
ReactDOM.render(<MyCom name="你好,么么哒"/>,document.getElementById("demodiv"))
</script>
3.2 设置默认属性
类方式创建使用defaultPropos进行默认值设置两种方式
<script type="text/babel">
class MyCom extends React.Component{
//方式2
static defaultProps={
name:"我是默认值"
}
render(){
return (
<div>
<p>我是组件{this.props.name}</p>
</div>
)
}
}
//方式1
// 组件名.defaultProps+{
// nnn:"nnn"
// }
// MyCom.defaultProps={
// name:"我是默认值"
// }
ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>
4. 事件处理基础
4.1 事件处理
- React事件绑定属性的命名采用驼峰式写法。
- 绑定函数的过程中不加() 否则函数会立即执行
<button onClick={this.fun}>点击</button>
<script type="text/babel">
// function fun(){
// console.log("么么哒")
// }
class MyCom extends React.Component{
constructor(props){
super(props)
}
fun(){
console.log("你好,么么哒")
}
render(){
return (
<div>
{ /* 不能加圆括号,加圆括号函数自动触发 */}
<p onClick={this.fun}>我是父组件</p>
</div>
)
}
}
ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>
State 状态机
1. 状态机
- 在react中开发者只需要关心数据。数据改变页面就会发生改变
- 数据等同于状态。状态改变-页面绑定的数据就由react进行改变
- 组件被称之为“状态机”,通过更新组件的state来更新对应页面的显示(从新渲染组件 不需要要操作 DOM)
2. 使用
2.1初始化状态
使用状态必须先初始化:this.state={}
class MyCom extends React.Component{
//1.先创建状态
constructor(props){
//默认是没有this的,要从父中八this拿过来
super(props)
//使用this.state来进行初始化
this.state={
name:"小明"
}
}
}
2.2读取状态
读取状态:this.state.key1
render(){
return (
<div>
<h1>{this.state.name}</h1>
</div>
)
}
2.3更新状态
更新状态—》组件界面更新:this.setState({})
fun=()=>{
//注意单词
this.setState({
name:"大黄"
})
}
完整使用
<script type="text/babel">
// 在这里注意,一定要清楚:
// 如果一个组件有状态,不能使用函数组件的方式
class MyCom extends React.Component{
//1.先创建状态
constructor(props){
//默认是没有this的,要从父中八this拿过来
super(props)
//使用this.state来进行初始化
this.state={
name:"小明"
}
}
//在这里需要注意的是函数的this
/* //修改this指向1
fun=()=>{
//注意单词
this.setState({
name:"大黄"
})
} */
fun=()=>{
//注意单词
this.setState({
name:"大黄"
})
}
render(){
return (
<div>
<h1>{this.state.name}</h1>
{ /* 修改this指向2:在调用的时候传入this */}
<button onClick={this.fun.bind(this)}>点我修改数据</button>
</div>
)
}
}
ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>
扩展知识
- 为什么不用工厂方式创建组件
在有状态的前提下 不能使用工厂方式创建组件 - 修改this指向
- 通过bind方法进行原地绑定,从而改变this指向
- 通过创建箭头函数
- 在constructor中提前对事件进行绑定
- 将事件调用的写法改为箭头函数的形式
练手demo:
- 同步修改输入框输入内容值改变
<script type="text/babel">
//1.创建组件
class MyCom extends React.Component{
constructor(props){
super(props)
//2.创建状态数据
this.state={
inputval:'22222'
}
}
//5.创建函数
//7.设置event对象
fun=(e)=>{
//6.修改state的数据
this.setState({
// inputval:?????数据怎么来,详见第七步
inputval:e.target.value
})
}
render(){
return (
<div>
{/* 4.绑定事件,当用户输入的时候,触发修改操作 */}
{/* 8.把输入框也绑定上state的数据 */}
<input type="text" onInput={this.fun} value={this.state.inputval}/>
{/* 展示state的数据 */}
<h1>输入框输入的数据是====={this.state.inputval}</h1>
</div>
)
}
}
ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>
- 当点击页面内容–文字进行改变
<script type="text/babel">
class My extends React.Component{
constructor(props){
super(props)
this.state={
text:"我是默认的"
}
}
fun(){
this.setState({
text:'你好,么么哒'
})
}
render(){
return(
<div>
<h1 onClick={this.fun.bind(this)}>点我</h1>
<p>我是要变化的值====={this.state.text}</p>
</div>
)
}
}
ReactDOM.render(<My/>,document.getElementById("demodiv"))
</script>
- 点击按钮添加页面内容
<script type="text/babel">
class My extends React.Component{
constructor(props){
super(props)
this.state={
inputval:"",
text:''
}
}
fun=(e)=>{
this.setState({
inputval:e.target.value
})
}
func(){
this.setState({
text:this.state.inputval
})
}
render(){
return(
<div>
<input type="text" onInput={this.fun}/>
<button onClick={this.func.bind(this)}>点我设置</button>
<p>输入框的内容是++++++{this.state.text}</p>
</div>
)
}
}
ReactDOM.render(<My/>,document.getElementById("demodiv"))
</script>
温馨提示:
本篇博客中的案例中挖了很多的坑,填平有进步喔