• 查找DOM,受控与非受控组件


    1.查找dom节点

    常用的方法有两种:

          第一种常用的方法

                1.在constructor中创建ref对象;this.变量 = React.createRef()

                2.在标签中使用ref属性绑定创建的ref对象 ref={this.变量对象}

                3.在方法中直接获取 this.变量.current

           第二种常用的方法

                1.标签中ref属性值是一个箭头函数,

                2.函数体是将形参el赋值给this.变量(全局变量)

                3.在方法种获取自定义的变量

    1. // 类组件
    2. class MyCom extends React.Component {
    3. constructor(props) {
    4. super()
    5. this.state = {
    6. count: 0
    7. }
    8. // 第三种方法
    9. this.d3 = React.createRef() // 创建一个ref对象
    10. }
    11. //
    12. getDOM = () => {
    13. // 1 原生的查找的方式 不建议使用
    14. console.log(document.getElementById("d1"))
    15. // 2 给标签添加ref属性 获取的时候通过this.refs.属性值进行获取,类似vue的dom的查找方式,这种方法即将删除的 不建议使用
    16. console.log(this.refs.d2)
    17. // 3常用 在构造函数使用creteRef创建一个ref属性值,在标签上添加ref属性值为这个定义的对象 建议使用
    18. console.log(this.d3.current)
    19. // 4常用 对上面方法简写 ref属性值是一个回调函数,函数带了参数el,这个el就是当前元素
    20. console.log(this.d4)
    21. // 1. 获取函数式子组件 还是通过 ref={el=>this.d5=el}获取的时候,获取不到,是一个undefined的,
    22. // 因为函数式组件不能ref赋值。
    23. console.log(this.d5)
    24. // 2. 如果组件是类组件 可以获取组件对象
    25. console.log(this.d6)
    26. this.d6.show()
    27. }
    28. render() {
    29. return (
    30. <div>
    31. <button onClick={this.getDOM}> 查找DOMbutton>
    32. <div id="d1">div1div>
    33. <div ref="d2">div2div>
    34. <div ref={this.d3}>div3div>
    35. <div ref={el => this.d4 = el}>div4div>
    36. {/*子组件*/}
    37. {/*
    38. <Child1 ref={el=>this.d5=el}>Child1>
    39. */}
    40. <Child2 ref={el => this.d6 = el}>Child2>
    41. div>
    42. )
    43. }
    44. }
    45. function Child1() {
    46. return (
    47. <div>这是子组件div>
    48. )
    49. }
    50. class Child2 extends React.Component {
    51. constructor(props) {
    52. super()
    53. }
    54. show() {
    55. alert("类组件")
    56. }
    57. render() {
    58. return (
    59. <div>子组件2div>
    60. )
    61. }
    62. }
    63. const root = ReactDOM.createRoot(document.getElementById("app"))
    64. root.render(<MyCom />)

    2.受控组件与非受控组件

    1 受控组件:在react当中,默认可以完成从state到表单value的动态绑定,就是给form表单标签和数据添加双向绑定;

    实现方式:给input标签提供onchange事件,一旦检测到文本框内容有变化,马上执行onchange事件获取表单内容,就是指的是双向绑定;

    2 非受控组件: 操作dom获取想要的数据,ref属性接受一个回调函数,返回一个el节点, 

    实现方式:ref={el=>this.d5=el},this.d5就是元素通过这个this.d5获取标签的value值;没有更改状态,其他使用此状态的值不会更改

    2.1 input框的状态

    1.input的value必须和onChange一起用;

    2.input的defaultValue是只渲染第一次的值;

    3.readOnly是设置input为只读属性;

    1. class MyCom extends React.Component{
    2. constructor(props){
    3. super(props)
    4. this.state={
    5. count:0
    6. }
    7. }
    8. render(){
    9. return(
    10. <div>
    11. 1 value可以结合readOnly属性实现只读标签
    12. <input type="text" value={this.state.count} readOnly/>
    13. <br/>
    14. 2 通过使用defaultValue 绑定默认值,只在初始化绑定一次,不更新,没有响应式特点
    15. <input type="text" defaultValue={this.state.count}/>
    16. <br/>
    17. 3 通过value和onchange事件实现双向绑定,这个组件就叫受控组件;具有响应式特点;
    18. <input type="text" value={this.state.count} onChange={(e)=>{
    19. this.setState({
    20. count:e.currentTarget.value
    21. })
    22. }}/>
    23. div>
    24. )
    25. }
    26. }
    27. const root = ReactDOM.createRoot(document.getElementById("app"))
    28. root.render(<MyCom/>)

     2.2 受控组件和非受控组件

    1.通过dom获取节点然后更改节点的值的话,不会更改状态的值;

    2.更改状态的值必须通过this.setState方法;

    1. class MyCom extends React.Component{
    2. constructor(props){
    3. super(props)
    4. this.state={
    5. msg:"昨天郑州新增64+294,数据比以往增加太多了"
    6. }
    7. }
    8. render(){
    9. let {msg} = this.state
    10. return(
    11. <div>
    12. <h1>输入框的数据:{msg}h1>
    13. {/*非受控组件*/}
    14. <input type="text" ref={el=>this.d2=el} defaultValue={msg}/>
    15. {/*受控组件*/}
    16. <input type="text" value={msg} ref={el=>this.d1=el} onChange={(e)=>{
    17. this.setState({
    18. msg:e.target.value
    19. })
    20. }}/>
    21. <button onClick={()=>{
    22. this.d1.value = "今天不知道啥情况郑州"
    23. this.d2.value = "111"
    24. }}> ref修改button>
    25. <button onClick={()=>{
    26. console.log("获取数据",this.state.msg)
    27. console.log("获取数据",this.d1.value)
    28. }}>点击获取button>
    29. div>
    30. )
    31. }
    32. }
    33. const root = ReactDOM.createRoot(document.getElementById("app"))
    34. root.render(<MyCom/>)

      总结

            1 受控组件  

                受控组件依赖于状态

                受控组件的修改会实时映射在状态值上

                受控组件只有继承于React.component才会有状态

                受控组件必须在使用onchange事件绑定对应的事件

            2 非受控组件

               非受控组件不受状态的控制

               非受控组件获取数据 相当于操作ODM

            适用场景

                1 受控组件使用场景 一般需要动态设置其初始值的时候,

                2 非受控组件使用场景:一般用于无任何动态初始值的情况

  • 相关阅读:
    牛客小白月赛59
    微信小程序——常用组件的属性介绍
    为什么科技型企业需要“贯标”?
    scapy No such device exists (No such device exists)
    如果你是独立开发者,你是先写前端还是先写后端?
    电力物联网关智能通讯管理机-安科瑞黄安南
    服务器启用SGX(以PowerEdge R750为例)
    老板让我牵头搞ELK,我该如何确定ES的集群规模?
    Qt程序打包成.exe可执行文件
    项目管理到底管的是什么?
  • 原文地址:https://blog.csdn.net/weixin_48879122/article/details/127794175