react点击父组件按钮,子组件input聚焦

核心思想
  • 父组件定义一个this.state.focus=false传入子组件,子组件通过props.fosus获取这个参数来判断是否执行focus()
  • 点击按钮通过this.setState来改变focus,此时会触发render重绘,子组件获取的props.focus被更新,从而使得focus执行;
    这里我遇到一个问题
    我在Son组件定义了一个私有方法isFocus
    在这里插入图片描述
    然后在render中执行这个方法,结果没有达到预期效果。
    原因
    isFocus的执行时间在render之前,所以var a = document.createElement('input')执行时还没有这个元素,即获取不到这个元素;所以必须在dom上树后再执行这句话才对。
    综上所述
    isFocus定义在componentDidUpdate里面才对; 因为虽然第一次执行的是componentDidMount,但此时是初始化状态,不需要获取该元素,而每次render重绘之后,componentDidUpdate执行之后dom就已上树,可以获取元素。
Father.js
import React from "react"
import {render} from "react-dom"
import Son from "./Son.js"

class Father extends React.Component{
    constructor(){
        super();
        this.state={
            'focus':false
        };
        console.log("Father Constructor")
    }
    click(){
        this.setState({
            'focus':true
        });
    }
    render() {
        return(
            <div>
                <input type="button" value='父组件'  onClick={(this.click).bind(this)} />
                <Son focus={this.state.focus}/>
            </div>
        )
    }
}
export  default Father
Son.js
import React from "react"
import {render} from "react-dom"

class Son extends React.Component{
    constructor({focus}){
        super();


    }
    componentDidUpdate(prevProps, prevState, snapshot) {
        var self = this;
        var a= document.getElementById('input');
        !function isFocus(){
            if (self.props.focus){
                a.focus()
            }
        }()
    }
    render() {

        return(
            <div>
                <input type="text" value='' ref='a' id='input'/>
            </div>
        )
    }
}
export  default Son

总结

可以把这当成一个模板:父组件需要对子组件进行干预时,可传一个变量来,然后子组件通过this.props.val来进行判断是否执行操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值