知名网站建设定制猿创征文|【React 三】组件实例的三大属性(state、props、refs)

目录


一、 State

1.概念

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

2.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>Document</title>
  8. <style>
  9. .btn{
  10. width: 100px;
  11. height: 40px;
  12. background-color: red;
  13. }
  14. .on{
  15. background-color: gray;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="root"></div>
  21. <!-- 引入react核心库 -->
  22. <script src="js/react.development.js"></script>
  23. <!-- 引入操作dom的扩展库 -->
  24. <script src="js/react-dom.development.js"></script>
  25. <!-- 引入babel来解析jsx语法 -->
  26. <script src="js/babel.min.js"></script>
  27. <script type="text/babel">
  28. class IsLike extends React.Component {
  29. state = { flag:true }
  30. //箭头函数this指向上下文,静态不可改变
  31. changeFlag=()=>{
  32. this.setState({flag:!this.state.flag})
  33. }
  34. render() {
  35. const {flag}=this.state
  36. return (
  37. <div>
  38. <button className={flag?'btn':'btn on'} onClick={this.changeFlag}>{flag?'喜欢':'不喜欢'}</button>
  39. </div>
  40. )
  41. }
  42. }
  43. ReactDOM.render(<IsLike/>,document.getElementById('root'))
  44. </script>
  45. </body>
  46. </html>

3. JS绑定事件

  1. let btn = document.getElementById('btn');
  2. btn.addEventListener('click',function(){
  3.    alert('按钮被点击了!');
  4. })
  5. btn.onclick = function(){
  6.  alert('按钮被点击了!');
  7. }
  8. function demo(){
  9. alert('按钮被点击了');
  10. }

 4.react 绑定事件

  1. render(){
  2. return <a href='javascript:;' onClick={demo} className='btn'>{this.state.isflag?'已关注':'取消关注'}</a>
  3. }

说明:

·onclick 变为 onClick。

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

5.react this指向问题

  1. demo(){      console.log(this);//undefined
  2. console.log('事件被点击了');
  3. }

举例说明:

  1. class Person{
  2.      constructor(name,age) {
  3.                  this.name = name;
  4.  this.age = age;
  5.      }
  6. say(){
  7.  console.log(this);
  8.  }
  9.  }
  10. const p1 = new Person('张三',18);
  11. p1.say();//p1为实例对象
  12. const p2 = p1.say;
  13. p2();//undefined 类采取是严格模式

6.修改state值

  1. class MyClass extends React.Component{
  2. constructor(props) {   
  3.    super(props);
  4.    this.state = {isflag:true};
  5.    this.demo = this.demo.bind(this);
  6. }render(){
  7. return <a href='javascript:;' onClick={this.demo} className='btn'>{this.state.isflag?'已关注':'取消关注'}</a>
  8. }
  9. demo(){
  10.     this.setState({isflag:!this.state.isflag})
  11. }}
  12.  ReactDOM.render(<MyClass/>,document.getElementById('root'));

说明:

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

7.代码简写

  1. class MyClass extends React.Component{
  2. state = {isflag:true}
  3. render(){
  4. return <a href='javascript:;' onClick={this.demo} className='btn'>{this.state.isflag?'已关注':'取消关注'}</a>
  5. }
  6.  demo = () => {
  7.     this.setState({isflag:!this.state.isflag})
  8.  }
  9. }
  10. ReactDOM.render(<MyClass/>,document.getElementById('root'));

说明:

类中的属性直接赋值,省去构造函数。

自定义方法—用赋值语句的形式+

二、props

1.概念

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

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

props 是不可变的,只能通过 props 来传递数据。

2.传参的基础方法、运算符传参

其中先通过let创建了一个对象,在通过三点运算符,来遍历得到,对象里面的值

在通过对象结构得到props中的realname和age,GetName是Person组件的子组件,在Person中传值给GetName,GetName通过props接收

  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>Document</title>
  8. </head>
  9. <body>
  10. <div id="root"></div>
  11. <!-- 引入react核心库 -->
  12. <script src="js/react.development.js"></script>
  13. <!-- 引入操作dom的扩展库 -->
  14. <script src="js/react-dom.development.js"></script>
  15. <!-- 引入babel来解析jsx语法 -->
  16. <script src="js/babel.min.js"></script>
  17. <script type="text/babel">
  18. class GetName extends React.Component {
  19. render() {
  20. return (
  21. <div>姓名:{this.props.realname}</div>
  22. );
  23. }
  24. }
  25. class Person extends React.Component {
  26. render() {
  27. const {realname,age} = this.props
  28. return (
  29. <div>
  30. <GetName realname={this.props.realname}/>
  31. <span>年龄:{age}</span>
  32. </div>
  33. );
  34. }
  35. }
  36. let p1 = {realname:'张三',age:19}
  37. ReactDOM.render(<Person {...p1}/>,document.getElementById('root'))
  38. </script>
  39. </body>
  40. </html>

三、refs

定义

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

字符串形式的ref、回调函数下ref、createRef 创建ref容器

字符串形势,是直接通过ref绑定值,通过在点击事件中获取ref的值,ref如同把整个input表单传了过来,在获取值的时候需要点一下value来获取的是input表单的内容

通过ref中的箭头函数,绑定了值,在方法中直接获取即可,穿过来时,由于react的编译不需要写target但是,还是需要点出value

通过createRef来创建两个容器,通过对象的形势与ref绑定,直接就可以在方法中得到值,不过这里要注意,打印还是获取的时候在点value之前点一个current,如this.realname.current.value

  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>Document</title>
  8. </head>
  9. <body>
  10. <div id="root"></div>
  11. <!-- 引入react核心库 -->
  12. <script src="js/react.development.js"></script>
  13. <!-- 引入操作dom的扩展库 -->
  14. <script src="js/react-dom.development.js"></script>
  15. <!-- 引入babel来解析jsx语法 -->
  16. <script src="js/babel.min.js"></script>
  17. <script type="text/babel">
  18. class Person extends React.Component {
  19. //createRef 创建ref容器
  20. realname = React.createRef()
  21. age = React.createRef()
  22. ShowInfo=()=>{
  23. //字符串
  24. // const {realname,age}=this.refs
  25. // console.log(`姓名:${realname.value}年龄:${age.value}`);
  26. //回调函数
  27. // let realname = this.realname.value
  28. // let age = this.age.value
  29. // console.log(`姓名:${realname}年龄:${age}`);
  30. //类绑定
  31. console.log(this.realname.current.value);
  32. console.log(this.age.current.value);
  33. }
  34. render() {
  35. return (
  36. /*字符串形势
  37. <div>
  38. <p><input type="text" placeholder="请输入姓名" ref='realname'/></p>
  39. <p><input type="text" placeholder="年龄" ref='age'/></p>
  40. <p><button onClick={this.ShowInfo}>提交</button></p>
  41. </div>
  42. */
  43. //回调函数
  44. // <div>
  45. // <p><input type="text" placeholder="请输入姓名" ref={e=>this.realname=e}/></p>
  46. // <p><input type="text" placeholder="年龄" ref={e=>this.age=e}/></p>
  47. // <p><button onClick={this.ShowInfo}>提交</button></p>
  48. // </div>
  49. //createRef 创建ref容器
  50. <div>
  51. <p><input type="text" placeholder="请输入姓名" ref={this.realname}/></p>
  52. <p><input type="text" placeholder="年龄" ref={this.age}/></p>
  53. <p><button onClick={this.ShowInfo}>提交</button></p>
  54. </div>
  55. );
  56. }
  57. }
  58. ReactDOM.render(<Person/>,document.getElementById('root'))
  59. </script>
  60. </body>
  61. </html>

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发