state的基本使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>state</title>
</head>
<body>
<!---准备好一个容器-->
<div id="test">
</div>
<!---引入核心库,必须最先引入-->
<script src="../js//react.development.js"></script>
<!---引入react-dom,用于支持react操作dom,其次引入-->
<script src="../js/react-dom.development.js"></script>
<!---引入babel,用于将jsx转化为js,最后引入-->
<script src="../js/babel.min.js"></script>
<script type="text/babel">
//1.创建组件
class Weather extends React.Component{
constructor(props) {
super(props)
// 初始化状态
this.state = {isHot: true}
}
render() {
console.log(this)
//读取状态
const {isHot} = this.state
return <h1>今天天气很{isHot ? '炎热' : '凉爽'}</h1>
// return <h1>今天天气很{this.state.isHot ? '炎热' : '凉爽'}</h1>
}
}
// 2.渲染组件
ReactDOM.render(<Weather />, document.getElementById('test'))
</script>
</body>
</html>
react中的事件绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>react中的事件绑定</title>
</head>
<body>
<!---准备好一个容器-->
<div id="test">
</div>
<!---引入核心库,必须最先引入-->
<script src="../js//react.development.js"></script>
<!---引入react-dom,用于支持react操作dom,其次引入-->
<script src="../js/react-dom.development.js"></script>
<!---引入babel,用于将jsx转化为js,最后引入-->
<script src="../js/babel.min.js"></script>
<script type="text/babel">
//1.创建组件
class Weather extends React.Component{
constructor(props) {
super(props)
// 初始化状态
this.state = {isHot: true}
}
render() {
console.log(this)
//读取状态
const {isHot} = this.state // 结构赋值
return <h1 onClick= {demo}>今天天气很{isHot ? '炎热' : '凉爽'}</h1>
}
}
// 2.渲染组件
ReactDOM.render(<Weather />, document.getElementById('test'))
// const title = document.getElementById('title')
// title.addEventListener('click', () => {
// alert('标题被点击了')
// })
// const title = document.getElementById('title')
// title.onclick= () => {
// alert('标题被点击了')
// }
function demo() {
console.log('标题被点击了')
}
</script>
</body>
</html>
注意:在进行事件绑定的时候不要使用addEventListener和onclick,避免使用原生js,而是在标签
中添加属性onClick,on后面的单词的首字母必须大写,绑定的的回调函数不要写小括号
类中的this
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>类中的方法this</title>
</head>
<body>
<!---准备好一个容器-->
<div id="test">
</div>
<!---引入核心库,必须最先引入-->
<script src="../js//react.development.js"></script>
<!---引入react-dom,用于支持react操作dom,其次引入-->
<script src="../js/react-dom.development.js"></script>
<!---引入babel,用于将jsx转化为js,最后引入-->
<script src="../js/babel.min.js"></script>
<script type="text/babel">
//1.创建组件
class Weather extends React.Component{
constructor(props) {
// 构造器调用几次-----1次
// console.log('constructor')
super(props)
// 初始化状态
this.state = {isHot: true,wind:'微风'}
console.log(this);
// 解决changeWeather中this指向问题
this.changeWeather = this.changeWeather.bind(this)
}
render() {
// render调用了几次------1+n次,1是初始化的那次,n是状态更新的次数
// console.log('render');
// console.log(this)
//读取状态
const {isHot,wind} = this.state // 结构赋值
return <h1 onClick= {this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
}
// changeWeather调用了几次----点几次调用几次
changeWeather() {
console.log(this);
//changeWeather放在了哪里?----Weather的原型对象上,供实例使用
//由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用
// 类中的方法默认开启了局部的严格模式,所以changeWeather中的this是undefined
// console.log('标题被点击了')
// 获取原来的isHot
const isHot = this.state.isHot
// 严重注意:状态的修改必须使用setState进行更新,且更新时一种合并,不是替换
this.setState({isHot:!isHot})
// 严重注意:状态(state)不可直接更改,下面这行就是直接更改
// this.state.isHot = !isHot // 这是错误的写法
// console.log(this.state.isHot)
}
}
// 2.渲染组件
ReactDOM.render(<Weather />, document.getElementById('test'))
</script>
</body>
</html>
state的简写形式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>state的简写方式</title>
</head>
<body>
<!---准备好一个容器-->
<div id="test">
</div>
<!---引入核心库,必须最先引入-->
<script src="../js//react.development.js"></script>
<!---引入react-dom,用于支持react操作dom,其次引入-->
<script src="../js/react-dom.development.js"></script>
<!---引入babel,用于将jsx转化为js,最后引入-->
<script src="../js/babel.min.js"></script>
<script type="text/babel">
//1.创建组件
class Weather extends React.Component{
// 初始化状态
state = {isHot: true,wind:'微风'}
render() {
const {isHot,wind} = this.state
return <h1 onClick= {this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
}
// 自定义方法----要用赋值语句+箭头函数
//此处使用箭头函数后,this指向与外层函数的指向相同,this指的是Weather实例
//所以不用写 this.changeWeather = this.changeWeather.bind(this)来修改this指向
changeWeather = () => {
const isHot = this.state.isHot
this.setState({isHot:!isHot})
}
}
// 2.渲染组件
ReactDOM.render(<Weather />, document.getElementById('test'))
</script>
</body>
</html>
总结state:
1)理解:
state是组件对象最重要的属性,值是对象(可以包含多个key-value的组合);
组件被称为状态机,通过更新组件的state来更新对应的页面显示(重新渲染组件);
在进行state数据的初始化的时是在实例对象自身进行添加,可以不在构造器函数内部书写,可直
接写state= {属性:'属性值'}
2)强烈注意:
组件中render方法中的this为组件实例对象 组件自定义中的方法this为undefined,如何解决?
强制绑定this:通过函数对象的bind()---在构造函数中进行修改this指向
箭头函数-----必须写赋值语句,也就是state的简写形式
3)状态数据:不能直接修改或者是更新,修改状态使用setState