zoukankan      html  css  js  c++  java
  • react中refs的使用

    1、在dom元素中使用ref

    意思就是可以在组件中创建一个dom节点的textInput,并将ref直接绑定到他

    <script src="https://unpkg.com/@babel/standalone/babel.js"></script>
    <script src="https://unpkg.com/react/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
    <div id="root"/>
    <script type="text/babel">
      //在dom元素上使用ref
      class App extends React.Component{
        constructor(props){
          super(props)
          this.textInput = React.createRef() (ref对象)
          this.focusTextInput = this.focusTextInput.bind(this)
        }
        focusTextInput(){
          this.textInput.current.focus()
        }
        render(){
          return (
          <div>
            <input type="button" onClick={this.focusTextInput} value="获取焦点" />
            <input type="text" ref={this.textInput} />
          </div>
          )
        }
      }
      ReactDOM.render(<App />, document.getElementById('root'));
    </script>
    

    2、为class组件添加refs

    <script src="https://unpkg.com/@babel/standalone/babel.js"></script>
    <script src="https://unpkg.com/react/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
    <div id="root"/>
    <script type="text/babel">
      class CustomeInput extends React.Component{
        constructor(props){
          super(props)
          this.textInput = React.createRef()
          this.textInputFocus = this.textInputFocus.bind(this)
          
        }
        textInputFocus(){
          this.textInput.current.focus()
        }
        render(){
          return (
          <React.Fragment>
            <input readOnly type="button"  value="点击我"  />
            <input onChange={()=>{}} ref={this.textInput} value="Focus the text input"  />
          </React.Fragment>
          )
        }
      }
      
      class App extends React.Component{
        constructor(props){
          super(props)
          this.textInput = React.createRef()
        }
        componentDidMount(){
          this.textInput.current.textInputFocus()
        }
        render(){
          return (
          <div><CustomeInput  ref={this.textInput} /></div>
          )
        }
      }
      
      ReactDOM.render(<App />, document.getElementById('root'));
    </script>
    
    import React, { Component } from 'react';
    import ReactDOM from 'react-dom'
    import { ThemeContext,themes } from './components/ThemeContext';
    import ThemeButton from './components/ThemeButton'
    
    class CustomInput extends React.Component{
        constructor(props){
            super(props)
        }
        render(){
            return <input onChange={()=>{}} value="fouse" ref={this.props.inputRef} />
        }
    }
    
    class App extends React.Component{
        constructor(props){
            super(props)
            this.input = React.createRef()
        }
        componentDidMount() {
            this.input.current.focus()
        }
        render(){
            return (
                <div>
                    <CustomInput inputRef={this.input} />
                </div>
            )
        }
    }
    
    
    ReactDOM.render(<App />,document.getElementById('root'))
    

    3、通过转发的方式将将 DOM Refs 暴露给父组件

    <script src="https://unpkg.com/@babel/standalone/babel.js"></script>
    <script src="https://unpkg.com/react/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
    <div id="root"/>
    <script type="text/babel">
    //利用forwardRef 将ref转发给dom元素的button
    const FancyButton = React.forwardRef((props,ref)=>(
        <button ref={ref} onClick={props.onClick}>
        {props.children}
        </button>
    ))
    
    class App extends React.Component{
        constructor(props){
            super(props)
            this.ref = React.createRef()
            this.clickHandle = this.clickHandle.bind(this)
        }
        clickHandle(){
            console.log(this.ref.current)
        }
        render(){
            return (
                <FancyButton ref={this.ref} onClick={this.clickHandle}>clickME</FancyButton>
            )
        }
    }
    </script>
    

     4、回调refs

     注:内联的回调refs 会调用二次 第一次返回null

    内联的写法:

    <input ref={(e)=>this.inputText=el} onChange={()=>{}} value="inputfocus" />
    <script src="https://unpkg.com/@babel/standalone/babel.js"></script>
    <script src="https://unpkg.com/react/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
    <div id="root"/>
    <script type="text/babel">
      //回调refs
      class App extends React.Component{
        constructor(props){
          super(props)
          this.inputText=null;
          this.setInputRef = (element)=>{
            this.inputText = element;
          }
          this.focusTextInput=()=>{
            if(this.inputText) this.inputText.focus()
          }
        }
        componentDidMount(){
          this.inputText.focus()
        }
        render(){
          return (
          <div>
            <input type="button" value="点击" onClick={this.focusTextInput} />
            <input ref={this.setInputRef} onChange={()=>{}} value="inputfocus" />
          </div>
          )
        }
      }
      
      ReactDOM.render(<App />, document.getElementById('root'));
    </script>
    
  • 相关阅读:
    ZZNU 正约数之和 2094
    ZZNUOJ 2022 摩斯密码
    POJ
    NYOJ 1277Decimal integer conversion (第九届河南省省赛)
    hrbust 2080链表 【贪心】
    hdu-5707-Combine String
    POJ 2442-Sequence(优先队列)
    Reversion Count
    python 07篇 内置函数和匿名函数
    python 06篇 常用模块
  • 原文地址:https://www.cnblogs.com/nianzhilian/p/13356278.html
Copyright © 2011-2022 走看看