【实战】React 实战项目常见报错 —— 直接使用 ref, 报错:react can not set ref string for ...

这篇具有很好参考价值的文章主要介绍了【实战】React 实战项目常见报错 —— 直接使用 ref, 报错:react can not set ref string for ...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、问题

react 中直接使用 ref, 报错:

react can not set ref string for ...

二、解决

1.React.createRef()

constructor() {
    super();
    this.refObj = React.createRef()
}

let refDom = this.refObj.current
let refDomValue = this.refObj.current.value
<div ref={ this.refObj }>

2.回调函数

constructor() {
    super();
    this.refObj = null;
    this.setRefObj = refObj =>{
        this.refObj = refObj ;
    }
}

let refDom = this.refObj.value
<div ref={this.setRefObj } ></div>


三、拓展学习

1.React.refs

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。

Refs 是一种非常特殊的属性,你可以用来绑定到 render() 输出的任何组件上去。这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在 任何时间 总是拿到正确的实例。

应用场景:

  • 管理焦点,文本选择或媒体播放。
  • 触发强制动画。
  • 集成第三方 DOM 库。

(1)创建 Refs

React.createRef()

React 16.3 版本引入 React.createRef() API

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={this.myRef} />;
  }
}

创建 Refs 分为两步:

  • 在构造函数中通过 React.createRef() API 声明 refs 并 将其设定为 整个组件的一个实例属性,以便在整个组件中使用,甚至传递出去
  • 在 render 函数中绑定 DOM 元素

(2)访问 Refs

const node = this.myRef.current;

ref 的值根据绑定DOM节点的类型而有所不同:

  • 当 ref 属性用于 原生 DOM 元素时,构造函数中使用 React.createRef() 创建的 ref 接收底层 DOM 元素作为其 current 属性。
  • 当 ref 属性用于自定义 class 组件时,ref 对象接收组件的挂载实例(实例化的组件)作为其 current 属性。

注意:

  • 不能在 函数组件 上使用 ref 属性,因为函数组件没有实例
  • 为 DOM 元素添加 ref
class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    this.textInput = React.createRef();
    this.focusTextInput = this.focusTextInput.bind(this);
  }

  focusTextInput() {
    // 直接使用原生 API 使 text 输入框获得焦点
    this.textInput.current.focus();
  }

  render() {
    return (
      <div>
        <input type="text" ref={this.textInput} />
        <input type="button" value="Focus the text input" onClick={this.focusTextInput}
        />
      </div>
    );
  }
}
  • 为 class 组件添加 Ref
class AutoFocusTextInput extends React.Component {
  constructor(props) {
    super(props);
    this.textInput = React.createRef();
  }

  componentDidMount() {
  	// 这里在父组件加载时,自动调用子组件中的方法,使 text 输入框获得焦点
    this.textInput.current.focusTextInput();
  }

  render() {
    return (
      <CustomTextInput ref={this.textInput} />
    );
  }
}
  • Refs 转发 – React

以上部分描述及案例来自:Refs and the DOM – React

react 16.3 之前版本使用方式:文章来源地址https://www.toymoban.com/news/detail-708758.html

  • React Refs | 菜鸟教程

到了这里,关于【实战】React 实战项目常见报错 —— 直接使用 ref, 报错:react can not set ref string for ...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React Dva项目中.roadhogrc.mock.js直接自动导入mock目录下所有文件方式

    上文 React Dva项目中模仿网络请求数据方法 中,我们书写了Dva项目模拟后端数据的方式 但是 我们.roadhogrc.mock.js中的这个处理其实并不好用 我们还需要一个一个的引入 我们可以直接靠一段代码 这就是一个读流的方式 获取mock目录下的所以文件 然后找出后缀为 .js的文件 全部弄

    2024年02月15日
    浏览(24)
  • React2023电商项目实战 - 1.项目搭建

    古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。 —— 陆游《《冬夜读书示子聿》》 项目搭建 App登录及网关 App文章 自媒体平台(博主后台) 内容审核(自动) ⑴. 登录注册 ⑵. 商城 ⑶. 购物车 ⑷. 个人中心 登录、注册 商城:模糊搜索、属性筛选(多选

    2024年02月12日
    浏览(31)
  • React项目实战--------极客园项目PC端

    1.项目介绍:主要将学习到的项目内容进行总结(有需要项目源码的可以私信我) 2.项目效果 1)登录页面 3.关于我的项目的配置如下,请注意下载的每个版本不一样,写的api也不一样 1.资料 1)短信接收M端演示: 极客园 http://geek.itheima.net 2)PC端接口文档: 极客园PC http://g

    2024年02月02日
    浏览(32)
  • 【实战】 React 与 Hook 应用:实现项目列表 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月09日
    浏览(38)
  • React + 项目(从基础到实战) -- 第九期

    实现分页 , LoadMore 上划加载更多功能效果 page : 当前页 pageSize: 页面大小 组件传值 发现 下滑时多次触发事件 使用ahooks中的useDebounceFn 发现一滑动就执行loadmore 目标: 底部load出现在页面中,就执行loadMore dom操作 useRef 并没实现,采取下面这种方法实现了,不知道为什么 当keyword变化

    2024年04月22日
    浏览(25)
  • React + 项目(从基础到实战) -- 第八期

    ajax 请求的搭建 引入mock AP接口设计 AJAX 通讯 HTTP 协议 , 前后端通讯的桥梁 API : XMLHttpRequest 和 fetch 常用工具axios Mock.js (mockjs.com) 前端代码中引入 mockJs 定义要模拟的路由 , 返回结果 mockJs 劫持ajax请求(返回模拟的结果) 使用fetch api 向后端发起请求 bug : 发现返回的数据不是我们模

    2024年04月25日
    浏览(27)
  • react+ts【项目实战一】配置项目/路由/redux

    1、该项目使用的是ts创建的 所以需要加上 --template typescript create-react-app kiki_ts_react_music --template typescript 2、 整理项目结构 删除一些自己用不到的文件 1.2.1 更换icon 1.2.2 更换项目名称 在index.html文件里面 1.2.1 配置项目别名 1、 npm i -D @craco/craco 2、在根文件创建 craco.config.ts 3、修

    2024年02月19日
    浏览(35)
  • React 中 Ref 引用

    不要因为别人的评价而改变自己的想法,因为你的生活是你自己的。 给标签设置 ref,ref=\\\"username\\\", 通过 this.refs.username 可以获取引用的标签,ref 可以获取到应用的真实 Dom 节点。但是 this.refs 已被废弃。 同上标签设置 ref 给组件设置 ref 也保持一致,ref=\\\"username\\\", 通过 this.r

    2024年02月05日
    浏览(28)
  • React三属性之:refs

    作用 refs是为了获取节点,使用场景主要在需要操作dom的时候,比如echarts,就需要真实的dom节点 使用 效果如下

    2024年02月09日
    浏览(23)
  • React:高阶组件|ref转发

            参考文档:高阶组件 – React (reactjs.org)         高阶组件(Higher-Order Components,简称  HOC )是React中用于复用组件逻辑的一种高级技巧。具体而言: 高阶组件是参数为组件,返回值为新组件的函数 。         组件是将 props 转换为 UI,而高阶组件是将组件转换

    2024年02月21日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包