P18:React高级-ref的使用方法

目录
文章目录隐藏
  1. 代替原来的 e.target.value
  2. ref使用中的坑
  3. 总结

在编写组件中的方法时,经常会遇到语义化很模糊的代码,这对于团队开发是一个很大的问题。因为 review 代码或者合作时都会影响开发效率。或者到这核心成员离开,项目倒闭的严重影响。所以我们必须重视 react 代码当中的语义化。ref是个不错的工具,快来学习一下吧。

代替原来的 e.target.value

以前的案例中,我们写了下面的代码,使用了e.target,这并不直观,也不好看。这种情况我们可以使用ref来进行解决。

inputChange(e){
    this.setState({
        inputValue:e.target.value
    })
}

如果要使用ref来进行,需要先在JSX中进行绑定, 绑定时最好使用 ES6 语法中的箭头函数,这样可以简洁明了的绑定 DOM 元素。

<input 
    id="mybj" 
    className="input" 
    value={this.state.inputValue} 
    onChange={this.inputChange.bind(this)}
    //关键代码——----------start
    ref={(input)=>{this.input=input}}
    //关键代码------------end
    />

绑定后可以把上边的类改写成如下代码:

inputChange(){
    this.setState({
        inputValue:this.input.value
    })
}

这就使我们的代码变得语义化和优雅的多。但是就我个人的经验来讲,我是不建议用ref这样操作的,因为React的是数据驱动的,所以用 ref 会出现各种问题。

ref使用中的坑

比如现在我们要用 ref 绑定取得要服务的数量,可以先用ref进行绑定。

<ul ref={(ul)=>{this.ul=ul}}>
    {
        this.state.list.map((item,index)=>{
            return (
                <MeinvItem 
                key={index+item}  
                content={item}
                index={index}
                deleteItem={this.deleteItem.bind(this)}
                />
            )
        })
    }
</ul>

绑定后可以在addList()方法中,获取当前<li>的值.

ddList(){
    this.setState({
        list:[...this.state.list,this.state.inputValue],
        inputValue:''
    })
    //关键代码--------------start
    console.log(this.ul.querySelectorAll('li').length)
    //关键代码--------------end
}

这时候你打开控制台,点击添加服务按钮,你会发现数量怎么少一个?(就是这个坑)如下图,

获取当前<li>的值

其实这个坑是因为 React 中更多setState是一个异步函数所造成的。也就是这个setState,代码执行是有一个时间的,如果你真的想了解清楚,你需要对什么是虚拟 DOM 有一个了解。简单的说,就是因为是异步,还没等虚拟 Dom 渲染,我们的console.log就已经执行了。

那这个代码怎么编写才会完全正常那,其实setState方法提供了一个回调函数,也就是它的第二个函数。下面这样写就可以实现我们想要的方法了。

addList(){
    this.setState({
        list:[...this.state.list,this.state.inputValue],
        inputValue:''
        //关键代码--------------start
    },()=>{
        console.log(this.ul.querySelectorAll('li').length)
    })
    //关键代码--------------end
}

现在到浏览器中查看代码,就完全正常了。

用 ref 绑定取得要服务的数量

总结

本文主要学习了ref的用法和ref中的坑。学完后练习一下吧,代码这东西,不练习你是学不会的。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » P18:React高级-ref的使用方法

发表回复