当前位置:   article > 正文

React —— React中组件的三大属性(state,props,ref)_react state ref

react state ref

文章目录

  • 前言
  • 一、 State(状态)
    • 1.1  State的书写形式
    • 1.2  绑定事件方法
    • 1.3  修改state值
    • 1.4 小案例
  • 二、props
    • 2.1 基础用法
    • 2.2 批量传递参数
  • 三、ref的使用
    • 3.1 字符串形式的ref
    • 3.2 回调函数下ref
    • 3.3 createRef 创建ref容器
  • 总结

前言

前面我们已经介绍了React中组件的相关知识,这里就以类式组件为例,讲解组件中的三大属性。

一、 State(状态)

概念:state是组件对象最重要的属性,值是对象(可以包含多个key:value的组合),组件被称为`状态机`,通过更新组件的state来更新对应的页面显示(重新渲染组件),有state称为复杂组件。

1.1  State的书写形式

State 的使用对象形式(key,value);

例如:
 

  1. state ={
  2. a: 10
  3. }

1.2  绑定事件方法

 

 <a href='javascript:;' onClick={demo} >已关注</a>

说明:

  • ·onclick 变为 onClick。
  • ·{函数名}返回值给click,加()就会直接调用。

1.3  修改state值

必须要使用  setState 方法修改state中的值

  1. demo( ){
  2.     this.setState({isflag:!this.state.isflag})
  3. }
  4.  }
  5.  ReactDOM.render(<MyClass/>,document.getElementById('hello'));

说明:

  • ·bind会生成一个新的方法 并传对象 改变this的指向
  • ·必须使用setState 修改才有效,修改内容为合并。有值得修改没有的不动

1.4 小案例

打铁需趁热,下面通过一个小案例和大家讲述state的具体用法以及上述小知识点的应用吧!

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>setState的用法</title>
  8. <style>
  9. button{
  10. width: 80px;
  11. height: 40px;
  12. border-radius: 10px;
  13. border: none;
  14. border: 1px solid #333;
  15. font-size: 16px;
  16. }
  17. span{
  18. color: red;
  19. font-size: 24px;
  20. font-style:italic;
  21. margin-left: 10px;
  22. }
  23. .yes{
  24. background: red;
  25. }
  26. .no{
  27. background: green;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div id="root"></div>
  33. <script src="../JS/react.development.js"></script>
  34. <script src="../JS//react-dom.development.js"></script>
  35. <script src="../JS/babel.min.js"></script>
  36. <script type="text/babel">
  37. // 利用类式组件
  38. class Person extends React.Component {
  39. // 类式组件中用来存储数据的地方,类似vue中的data,
  40. // 因为数据可以多种,所以采用对象的形式,
  41. // 又因为是在一个类中,所以很多书写习惯类似在定义类
  42. state ={
  43. flag: true,
  44. count: 1
  45. }
  46. // 因为是类,所以还是按照类中函数的书写形式,但要注意写成箭头函数形式
  47. clickNumber = ( )=>{
  48. // 要改变state中的数据,需要使用setState方法
  49. // 但也有可能改变的数据较多,所以可以采用对象的形式,
  50. // 这里的修改是合并修改,即有该属性就改变该属性的值,若没有则不改变
  51. this.setState({flag: !this.state.flag,
  52. count: ++this.state.count})
  53. }
  54. render() {
  55. return (
  56. <div>
  57. <button className={this.state.flag?'yes':'no'} onClick={this.clickNumber}>{this.state.flag ? '已点击':'未点击'}</button>
  58. <p>点击次数为:<span>{this.state.count}</span></p>
  59. </div>
  60. )
  61. }
  62. }
  63. // 转为真实dom到页面
  64. ReactDOM.render(<Person />, document.getElementById('root'));
  65. </script>
  66. </body>
  67. </html>

二、props

2.1 基础用法

  • 每个组件对象都会有props(properties的简写)属性。
  • 组件标签的所有属性都保存在props中。
  • props 是不可变的,只能通过 props 来传递数据。

具体使用方式如下:

  1. <script type="text/babel">
  2. // 类式组件
  3. class Person extends React.Component {
  4. // 提交事件的函数,要写成箭头函数
  5. submit=(event)=>{
  6. // 去除默认事件
  7. event.preventDefault();
  8. console.log(123);
  9. }
  10. render() {
  11. // 获取props的值
  12. const {realname,age} = this.props;
  13. return (
  14. <div>
  15. <form action="" >
  16. 姓名: <input type="text" value={realname}/>
  17. <br/>
  18. <br/>
  19. 年龄: <input type="text" value={age}/>
  20. <br/>
  21. <br/>
  22. <button onClick={this.submit}>提交信息</button>
  23. </form>
  24. </div>
  25. )
  26. }
  27. }
  28. // 渲染真实dom到页面上
  29. ReactDOM.render(<Person realname="Taylor Swift" age={30}/>, document.getElementById('root'));
  30. </script>

2.2 批量传递参数

  1. let p1 = {name:'张三',age:29};
  2. ReactDOM.render(<Person {...p1}/>,document.getElementById('hello'));

三、ref的使用

定义:组件内的标签可以定义ref来标识自己。

3.1 字符串形式的ref

  1. <script type="text/babel">
  2. // 类式组件
  3. class Person extends React.Component {
  4. realname = React.createRef();
  5. age = React.createRef();
  6. submit = (event) => {
  7. // 去除默认事件
  8. event.preventDefault();
  9. // 字符串形式的ref的获取方式——这里的refs没有$,要和vue区别开来
  10. console.log(this.refs.realname.value,this.refs.age.value);
  11. }
  12. render() {
  13. return (
  14. <div>
  15. <form action="">
  16. 姓名:<input type="text" ref="realname"/>
  17. 年龄:<input type="text" ref="age" />
  18. <br />
  19. <br />
  20. <input type="button" value="提交信息" onClick={this.submit} />
  21. </form>
  22. </div>
  23. )
  24. }
  25. }
  26. // 渲染真实dom到页面中
  27. ReactDOM.render(<Person />, document.getElementById('root'));
  28. </script>

3.2 回调函数下ref

  1. <script type="text/babel">
  2. // 类式组件
  3. class Person extends React.Component {
  4. realname = React.createRef();
  5. age = React.createRef();
  6. submit = (event) => {
  7. // 去除默认事件
  8. event.preventDefault();
  9. // 字符串形式的ref的获取方式——这里的refs没有$,要和vue区别开来
  10. // console.log(this.refs.realname.value);
  11. // 或函数形式的ref的获取方式
  12. console.log(this.realname.value);
  13. // 获取createRef形式的ref
  14. // console.log(this.realname.current.value);
  15. }
  16. render() {
  17. return (
  18. <div>
  19. <form action="">
  20. {
  21. /*
  22. 姓名:<input type="text" ref="realname"/>
  23. 年龄:<input type="text" ref="age" />
  24. 姓名:<input type="text" ref={(event) => { this.realname = event }} />
  25. 年龄:<input type="text" ref={(event) => { this.age = event }} />
  26. 姓名:<input type="text" ref={this.realname} />
  27. <br />
  28. <br />
  29. 年龄:<input type="text" ref={this.age} />
  30. */
  31. }
  32. 姓名:<input type="text" ref={(event) => { this.realname = event }} />
  33. 年龄:<input type="text" ref={(event) => { this.age = event }} />
  34. <br />
  35. <br />
  36. <input type="button" value="提交信息" onClick={this.submit} />
  37. </form>
  38. </div>
  39. )
  40. }
  41. }
  42. // 渲染真实dom到页面中
  43. ReactDOM.render(<Person />, document.getElementById('root'));
  44. </script>

3.3 createRef 创建ref容器

  1. <script type="text/babel">
  2. // 类式组件
  3. class Person extends React.Component {
  4. realname = React.createRef();
  5. age = React.createRef();
  6. submit = (event) => {
  7. // 去除默认事件
  8. event.preventDefault();
  9. // 字符串形式的ref的获取方式——这里的refs没有$,要和vue区别开来
  10. // console.log(this.refs.realname.value);
  11. // 或函数形式的ref的获取方式
  12. // console.log(this.realname.value);
  13. // 获取createRef形式的ref
  14. console.log(this.realname.current.value);
  15. }
  16. render() {
  17. return (
  18. <div>
  19. <form action="">
  20. {
  21. /*
  22. 姓名:<input type="text" ref="realname"/>
  23. 年龄:<input type="text" ref="age" />
  24. 姓名:<input type="text" ref={(event) => { this.realname = event }} />
  25. 年龄:<input type="text" ref={(event) => { this.age = event }} />
  26. 姓名:<input type="text" ref={this.realname} />
  27. <br />
  28. <br />
  29. 年龄:<input type="text" ref={this.age} />
  30. */
  31. }
  32. 姓名:<input type="text" ref={this.realname} />
  33. <br />
  34. <br />
  35. 年龄:<input type="text" ref={this.age} />
  36. <br />
  37. <br />
  38. <input type="button" value="提交信息" onClick={this.submit} />
  39. </form>
  40. </div>
  41. )
  42. }
  43. }
  44. // 渲染真实dom到页面中
  45. ReactDOM.render(<Person />, document.getElementById('root'));
  46. </script>

总结

以上就是今日的分享,有vue基础的同学在学react会发现有很多相同之处但react和vue的语法习惯还说不尽相同,所以对于和我一样的初学者还说要多写多练多思考,千万不要眼高手低哦!

最后依旧诚挚祝福屏幕前的你健康快乐,平安幸福!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/63377
推荐阅读
相关标签
  

闽ICP备14008679号