React之组件

React之组件

工厂函数组件(简单组件)

函数式调用

单个参数

import React from "react";
import ReactDom from "react-dom";

import App from "./App.js"

function App(props){ // 函数组件
   return <div>首页{props.content}{props.age}</div>
}

ReactDom.render(App('你好'),document.getElementById("root")); // 单个参数


多个参数

import React from "react";
import ReactDom from "react-dom";

import App from "./App.js"

function App(props){ // 函数组件
   return <div>首页{props.content}{props.age}</div>
}


ReactDom.render(App({content:"你好啊"}),document.getElementById("root")); // 多个参数 函数调用


组件标签式调用

单个参数

import React from "react";
import ReactDom from "react-dom";

import App from "./App.js"

function App(props){ // 函数组件
   return <div>首页{props.content}{props.age}</div>
}

ReactDom.render(<App></App>,document.getElementById("root")); // 组件式调用

单个参数

import React from "react";
import ReactDom from "react-dom";

import App from "./App.js"

function App(props){ // 函数组件
   return <div>首页{props.content}{props.age}</div>
}

ReactDom.render(<App content="你好" age="18"></App>,document.getElementById("root")); // 多个参数 组件式调用

组件三大属性

state

state是组件对象最重要的属性, 值是对象(可以包含多个数据)

组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件)

编码操作
  • 初始化状态

     constructor (props) {
      super(props)
      this.state = {
       stateProp1 : value1,
       stateProp2 : value2
      }
     }
    
  • 读取某个状态值

    this.state.statePropertyName
    
  • 更新状态---->组件界面更新

     this.setState({
      stateProp1 : value1,
      stateProp2 : value2
     })
    

注意:内部数据用state

props

每个组件对象都会有props(properties的简写)属性

组件标签的所有属性都保存在props中

  • 通过标签属性从组件外向组件内传递变化的数据
  • 注意: 组件内部不要修改props数据
编码操作
  • 内部读取某个属性值

this.props.propertyName

  • 对props中的属性值进行类型限制和必要性限制

    Person.propTypes = {
    
    name: React.PropTypes.string.isRequired,
    
    age: React.PropTypes.number.isRequired
    
    }
    
  • 扩展属性: 将对象的所有属性通过props传递

    <Person {...person}/>
    
  • 默认属性值

    Person.defaultProps = {
    name: 'Mary'
    }
    
  • 组件类的构造函数

    constructor (props) {
    super(props)
    console.log(props) // 查看所有属性
    }
    

refs和事件处理

refs属性
  • 组件内的标签都可以定义ref属性来标识自己

  • <input type=“text” ref={input => this.msgInput = input}/>

  • 回调函数在组件初始化渲染完或卸载时自动调用

  • 在组件中可以通过this.msgInput来得到对应的真实DOM元素

  • 作用: 通过ref获取组件内容特定标签对象, 进行读取其相关数据

用法

image-20201031143744378

image-20201031144058742

事件处理
  • 通过onXxx属性指定组件的事件处理函数(注意大小写)

    • React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
    • React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
  • 通过event.target得到发生事件的DOM元素对象

    <input onFocus={this.handleClick}/>
    handleFocus(event) {
    event.target //**返回**input**对象*
    }
    
注意
  • 组件内置的方法中的this为组件对象
  • 在组件类中自定义的方法中this为null
    • 强制绑定this: 通过函数对象的bind()
    • 箭头函数(ES6模块化编码时才能使用)
事件

使用箭头函数

bind两种写法

image-20201030170950373

点击事件
import React, { Component } from "react";
import Home from "./views/Home.js";
import About from "./views/About.js";

// 属性和行为(方法)
class App extends Component {
	constructor(props) {
		super(props);
		// 数据放在state中
		this.state = {
			com: <Home> </Home>,
		};
	}

	render() {
		return (
			<div>
				<button
					onClick={() => {
						// alert("首页");
						this.setState({
							com: <Home> </Home>,
						});
					}}
				>
					首页{" "}
				</button>
				<button
					onClick={() => {
						// alert("关于")
						this.setState({
							com: <About> </About>,
						});
					}}
				>
					关于{" "}
				</button>{" "}
				{this.state.com}{" "}
			</div>
		);
	}
}

export default App;

组件的组合

  • 拆分组件: 拆分界面,抽取组件
  • 实现静态组件: 使用组件实现静态页面效果
  • 实现动态组件
    • ​ ① 动态显示初始化数据
    • ​ ② 交互功能(从绑定事件监听开始)

问题:多个组件都需要使用数据,数据保存在哪个组件?

看数据是某个组件需要,如果是某个组件需要,数据就给他

如果是某些组件需要,就给他们共同的父组件

状态在哪个组件,更新状态的行为就应该在哪个组件

问题:需要在子组件中改变父组件的状态

子组件中不能直接改变父组件的状态

状态在哪个组件,更新状态的行为就应该在哪个组件

解决:在父组件定义函数,传递给子组件,子组件调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值