首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个具有任意多个子组件的React父组件如何在不使用useRef的情况下通过其字符串id更新选定的子组件?

在React中,如果一个具有任意多个子组件的父组件想要通过字符串id来更新选定的子组件,可以通过以下步骤实现,而不使用useRef:

  1. 在父组件中,创建一个状态变量来存储选定的子组件的id。可以使用useState来定义该状态变量,并初始化为一个默认值。
  2. 在父组件中,创建一个函数来更新选定的子组件。这个函数将接收一个id作为参数,并将该id存储到状态变量中。可以使用useState提供的更新函数来更新状态变量。
  3. 在父组件的render方法中,遍历所有子组件,并为每个子组件添加一个唯一的key属性。同时,为每个子组件添加一个onClick事件处理函数,该函数将调用步骤2中创建的函数,并传递子组件的id作为参数。
  4. 在子组件中,可以通过props来接收父组件传递的id。如果当前子组件的id与状态变量中存储的id相匹配,则进行相应的更新操作。

以下是一个示例代码:

代码语言:txt
复制
import React, { useState } from 'react';

function ParentComponent() {
  const [selectedId, setSelectedId] = useState(null);

  const updateSelectedId = (id) => {
    setSelectedId(id);
  };

  return (
    <div>
      {children.map((child) => (
        <ChildComponent
          key={child.id}
          id={child.id}
          isSelected={child.id === selectedId}
          updateSelectedId={updateSelectedId}
        />
      ))}
    </div>
  );
}

function ChildComponent({ id, isSelected, updateSelectedId }) {
  const handleClick = () => {
    updateSelectedId(id);
  };

  return (
    <div onClick={handleClick} style={{ background: isSelected ? 'yellow' : 'white' }}>
      {id}
    </div>
  );
}

在上述示例中,父组件ParentComponent通过遍历子组件列表,并为每个子组件添加了一个唯一的key属性和一个onClick事件处理函数。当子组件被点击时,会调用updateSelectedId函数,并传递子组件的id作为参数。父组件中的selectedId状态变量会被更新,然后传递给子组件。子组件根据isSelected属性来判断是否被选中,并进行相应的样式更新。

这种方法可以实现通过字符串id来更新选定的子组件,而不需要使用useRef。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

React实战精讲(React_TSAPI)

TextInput而我们想在组件调用处,通过ref来控制组件input。...从如下方面进行检测: 识别具有「不安全生命周期」组件 关于旧版字符串Ref API 使用警告 关于推荐使用 findDOMNode 警告 检测意外副作用 检测遗留Context API 确保可重用状态...:与memo理念上差不多,都是判断是否满足「当前限定条件」来决定是否执行callback函数,而useMemo第二个参数是一个「数组」,通过这个数组来判定是否执行回调函数 ❝当一个组件中调用了一个子组件时候...,组件 state 发生变化,会导致组件更新,而组件虽然没有发生改变,但也会进行更新。...并且 createRoot 「不修改容器节点」(只修改容器节点)。可以在覆盖现有节点情况下组件插入现有 DOM 节点。

10.3K30

react面试题整理2(附答案)

组件使用props来获取值组件组件传值 在组件中传递一个函数 在组件中用props来获取传递函数,然后执行该函数 在执行函数时候把需要传递值当成函数实参进行传递兄弟组件之间传值...利用组件 先把数据通过组件】===》【组件】 然后在数据通过组件】===〉【组件】 消息订阅 使用PubSubJs插件对React-Fiber理解,它解决了什么问题?...通常,render props 和高阶组件只渲染一个子节点。让 Hook 来服务这个使用场景更加简单。...它可以让你在编写 class 情况下使用 state 以及其他 React 特性。通过自定义hook,可以复用代码逻辑。...最典型应用场景:当组件具有overflow: hidden或者z-index样式设置时,组件有可能被其他元素遮挡,这时就可以考虑要不要使用Portal使组件挂载脱离组件

4.3K20

React 进阶 - Ref

场景一:跨层级获取 想要通过标记组件 ref ,来获取孙组件某一 DOM 元素,或者是组件实例 function Child(props) { const { grandRef } = props...高阶组件转发 如果通过高阶组件包裹一个原始类组件,就会产生一个问题,如果高阶组件 HOC 没有处理 ref ,那么由于高阶组件本身会返回一个组件,所以当使用 HOC 包装后组件时候,标记 ref...ref={ref} /> ; } // output // Index # ref 实现组件通信 如果有种场景不想通过组件 render 改变 props 方式,来触发组件更新...,也就是组件通过 state 单独管理数据层,针对这种情况组件可以通过 ref 模式标记组件实例,从而操纵组件方法,这种情况通常发生在一些数据层托管组件上,比如 表单,经典案例可以参考...parentSay 供组件使用组件通过调用方法可以设置组件展示内容 组件提供给组件 toParent,组件调用,改变组件展示内容,实现 双向通信 函数组件 forwardRef

1.7K10

React-Hook最佳实践

,在组件渲染完监听 hashchange ,回调函数是拿不到后续更新 state ,只能能到初始化时候字符串。...组件每次渲染,子函数组件如果不加 memo 的话,就算是组件无任何依赖,属性都不变情况下组件也会重新渲染如果在组件单独加为组件回调函数添加 useCallback,这样可以避免回调函数重新定义...,count 或者 step 任意这个属性改变,都会导致两个子组件重新渲染,这显然是不对。...因而上面的组件可以改一下,下面这种写法就可以防止任意一个属性改变会导致两个子组件重新渲染问题export const Count = () => { const { state, dispatch...可以实现定制组件可以引用组件属性和方法,而不是直接引用整个子组件实例,在组件需要调用组件属性和方法,但是又不想全部属性和方法都给组件调用时候使用useLayoutEffect 使用不多

3.9K30

vue2升级vue3:单文件组件概述 及 defineExposexpose

像我这种react门徒被迫迁移到vue,用管了TSX,地vue 单文件组件也不太感冒,但是vue3 单文件组件,造了蛮api ,还不得去了解下https://v3.cn.vuejs.org/api/...setup> 组件是默认关闭,也即通过模板 ref 或者 $parent 链获取到组件公开实例,不会暴露任何在 中声明绑定。...a: number, b: number } (ref 会和在普通实例中一样被自动解包)翻译成大白话就是:组件是声明时,组件(非)是不能直接访问组件方法...这可能不是我们希望看到,因为组件很可能拥有一些应保持私有的内部状态或方法,以避免紧耦合。expose 选项期望一个 property 名称字符串列表。...其实把它理解为 React函数组件 useImperativeHandle 就行!组件利用useImperativeHandle可以让组件输出任意数据。

2K30

react组件互相通信传值

(该章链接:https://juejin.cn/post/6992215510104408101) 组件传值与函数给组件,在组件里面可使用一个子组件值与函数;(该章链接:https://juejin.cn.../post/6992576182357082142) 1 组件传值与函数给组件,在组件使用组件值与函数# 主要是通过react三大属性之一props来进行。...详细 2 组件传值与函数给组件,在组件使用组件值与函数# 通过reacthooks新特性,useRef、useImperativeHandle、forwardRef 来实现。...useRef : useRef 返回一个可变 ref 对象, .current 属性被初始化为传入参数(initialValue)。返回 ref 对象在组件整个生命周期内持续存在。...详细 3 组件传值与函数给组件,在组件使用一个子组件值与函数# 实现方法差不多,通过reacthooks新特性,将useRef建立实例再通过props传给另一个子组件就可以啦

1.2K20

宝啊~来聊聊 9 种 React Hook

假设这样一种场景: 在根级别组件上我们需要向下传递一个用户名 username 属性给每一个子组件进行使用。 此时,如果使用 props 方法进行层层传递那么无疑是一种噩梦。...我们在组件中传递了一个 callback 函数作为 props 传递给了组件,每次渲染中我们并没有改变 callback 但是每次组件 re-render ,React 仍然会认为 callback...useImperativeHandle  可以让你在使用 ref 时自定义暴露给组件实例值。在大多数情况下,应当避免使用 ref 这样命令式代码。...我们希望在组件中调用组件方法,虽然 React 官方并不推荐这样声明式写法,但是有时候我们不得不这样做。...Input 组件通过 ref 调用到组件通过 useImperativeHandle 暴露出方法: import React, { useEffect, useRef } from 'react

1K20

React高手都善于使用useImprativeHandle

它接受我们自定义组件作为参数,并返回一个组件。新组件具备我们自定义组件全部能力,并得到一个 ref 属性,组件通过 useRef 获取到内容与内部组件 ref 完全一致。...而是希望组件能够调用组件内部某些方法 但是在 React 中,又无法直接 new 一个子组件实例,像面向对象那样通过组件实例去调用组件方法。...因此,React 提供了一个 hook,useImperativeHandle,让我们能够重写组件内部 ref 对应引用,从而达到在组件中,调用组件内部方法目的 例如,上面的 MyInput...如果传入依赖项,那么每次更新 createHandle 都会重新执行 useImperativeHandle 执行本身返回 undefined 04 官方案例 官方文档中有这种一个案例,效果如图所示。...={id} style={{width, height}} /> ) } export default forwardRef(Lottie) 这样封装好之后,我们就可以通过 ref 在组件中去调用

17510

react组件互相通信传值

(该章链接:https://juejin.cn/post/6992215510104408101) 组件传值与函数给组件,在组件里面可使用一个子组件值与函数;(该章链接:https://juejin.cn.../post/6992576182357082142) 1 组件传值与函数给组件,在组件使用组件值与函数 主要是通过react三大属性之一props来进行。...详细 2 组件传值与函数给组件,在组件使用组件值与函数 通过reacthooks新特性,useRef、useImperativeHandle、forwardRef 来实现。...useRef : useRef 返回一个可变 ref 对象, .current 属性被初始化为传入参数(initialValue)。返回 ref 对象在组件整个生命周期内持续存在。...详细 3 组件传值与函数给组件,在组件使用一个子组件值与函数 实现方法差不多,通过reacthooks新特性,将useRef建立实例再通过props传给另一个子组件就可以啦~

60930

今年前端面试太难了,记录一下自己面试题

通过this.props.match.params.id 取得url中动态路由id部分值,除此之外还可以通过useParams(Hooks)来获取通过query或state传值传参方式:在Link...自动绑定: React组件中,每个方法上下文都会指向该组件实例,即自动绑定this为当前组件。父子组件通信方式?组件组件通信:组件通过 props 向组件传递需要信息。...纯函数输入输出确定性 o useMemo 纯一个记忆函数 o useRef 返回一个可变ref对象,Current 属性被初始化为传递参数,返回 ref 对象在组件整个生命周期内保持不变。...useImperativeMethods 自定义使用ref时公开给组件实例值useMutationEffect 更新兄弟组件之前,它在React执行DOM改变同一阶段同步触发useLayoutEffect...React如何获取组件对应DOM元素?可以用ref来获取某个子节点实例,然后通过当前class组件实例一些特定属性来直接获取节点实例。

3.7K30

「不容错过」手摸手带你实现 React Hooks

class 情况下使用 state 以及其他 React 特性 凡是 use 开头 React API 都是 Hooks Hook 是什么 Hook 是一个特殊函数,它可以让你“钩入” React...如此很容易产生 bug 难以理解 class this 指向问题:组件组件传递函数时,必须绑定 this Hook 规则 只能在函数内部最外层调用 Hook,不要在循环、条件判断或者子函数中调用...useRef 返回一个可变 ref 对象, current 属性被初始化为传入参数 useRef 返回 ref 对象在组件整个生命周期内保持不变,也就是说每次重新渲染函数组件时,返回 ref...对象都是同一个(注意使用 React.createRef ,每次重新渲染组件都会重新创建 ref) let lastRef; function useRef(value) {...详解 【近 1W 字】+ 项目实战 推荐 React Hooks 组件中获取组件实例值 React Hooks 中 useRef 优雅使用 后记 如果你喜欢探讨技术,或者对本文有任何意见或建议

1.2K10

React Hook实战

1.2 Hook 概览 为了解决函数式组件状态问题,React 在16.8版本新增了Hook特性,可以让开发者在编写 类(class) 情况下使用 state 以及其他 React 特性。...2.3 useMemo 在传统函数组件中,当在一个组件中调用一个子组件时候,由于组件state发生改变会导致组件更新,而组件虽然没有发生改变但是也会进行更新,而useMemo就是函数组件为了防止这种不必要更新而采取手段...2.5 useRefReact中,我们使用Ref来获取组件实例或者DOM元素,我们可以使用两种方式来创建 Ref:createRef和useRef,如下所示。...其意思就是,组件可以选择性暴露一些方法给组件,然后隐藏一些私有方法和属性,官方建议,useImperativeHandle最好与 forwardRef 一起使用。...useImperativeHandle 将组件实例属性输出到组件,而组件内部通过 ref 更改 current 对象后组件不会重新渲染,需要改变 useState 设置状态才能更改。

2K00

React Ref 使用总结

,Counter 组件使用 ref 获取其实例对象,组件用 counterIntance 属性接收。...iptRef 状态(是一个 ref 回调形式函数)传递给组件组件 iptElm 就可以接收到 DOM 元素了。...如果不使用 Hook,在函数组件中是无法操作 DOM 一个办法就是写成类组件形式,或者将 DOM 元素传递给组件组件应是一个组件)。...这样,我们在组件使用 ref 时直接使用即可: function Child(props) { // 此时组件传来 ref 对象在 props 中 // 不好一点是,只能使用...使用 useRef useRef 除了访问 DOM 节点外,useRef 还可以有别的用处,你可以把它看作类组件中声明实例属性,属性可以存储一些内容,内容改变不会触发视图更新

6.9K40

React Hooks教程之基础篇

什么是Hooks Hook 是 React 16.8 新增特性。它可以让你在编写 class 情况下使用 state 以及其他 React 特性。...useEffect(重点掌握) 该 Hook 有两个参数,第一个参数是一个包含命令式、且可能有副作用代码函数,第二个参数是一个数组,此参数来控制该Effect包裹函数执执行,如果第二个参数传递,...并且,使用 useReducer 还能给那些会触发深更新组件做性能优化,因为你可以向组件传递 dispatch 而不是回调函数 。...常见应用场景:组件组件传递会回调函数(但是react官方推荐这种方式,官方推荐使用useReducer hook,通过传递dispatch来避免这种形式,具体原因参考官方解释) 示例: import...(重要) useRef 返回一个可变 ref 对象, current 属性被初始化为传入参数(initialValue)。

3K20

超实用 React Hooks 常用场景总结

在我看来,使用 React Hooks 相比于从前组件有以下几点好处: 代码可读性更强,原本同一块功能代码逻辑被拆分在了不同生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks...应用场景在于:创建初始 state 很昂贵时,例如需要通过复杂计算获得;那么则可以传入一个函数,在函数中计算并返回初始 state,此函数只在初始渲染时被调用: const [state, setState...memo 包一层,就能解决上面的问题;但是仅仅解决组件没有传参给组件情况以及组件传简单类型参数给组件情况(例如 string、number、boolean等);如果有传复杂属性应该使用...,触发组件重新渲染;组件渲染,const info = { name, age } 一行会重新生成一个新对象,导致传递给组件 info 属性值变化,进而导致组件重新渲染。...以下分别介绍 useRef 两个使用场景: 1、指向 dom 元素 如下所示,使用 useRef 创建变量指向一个 input 元素,并在页面渲染后使 input 聚焦 import React,

4.6K30

一文总结 React Hooks 常用场景

在我看来,使用 React Hooks 相比于从前组件有以下几点好处: 代码可读性更强,原本同一块功能代码逻辑被拆分在了不同生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks...应用场景在于:创建初始 state 很昂贵时,例如需要通过复杂计算获得;那么则可以传入一个函数,在函数中计算并返回初始 state,此函数只在初始渲染时被调用: const [state, setState...memo 包一层,就能解决上面的问题;但是仅仅解决组件没有传参给组件情况以及组件传简单类型参数给组件情况(例如 string、number、boolean等);如果有传复杂属性应该使用...,触发组件重新渲染;组件渲染,const info = { name, age } 一行会重新生成一个新对象,导致传递给组件 info 属性值变化,进而导致组件重新渲染。...以下分别介绍 useRef 两个使用场景: 1、指向 dom 元素 如下所示,使用 useRef 创建变量指向一个 input 元素,并在页面渲染后使 input 聚焦 import React,

3.4K20

美团前端经典react面试题整理_2023-02-28

组件会触发正常生命周期方法,包括 shouldComponentUpdate() 方法。如果标记发生变化,React 仍将只更新 DOM。...如果是在方法组件中调用组件(>= react@16.8),可以使用 useRef 和 useImperativeHandle: const { forwardRef, useRef, useImperativeHandle...在 React里样式并不是一个纯粹字符串,而是一个对象,这样在样式发生改变时,只需要改变替换变化以后样式。修改完当前节点之后,递归处理该节点节点。 如果组件类型相同,按以下方式比较。...当一个组件相关数据更新时,即使组件不需要用到这个组件组件还是会重新render,可能会有效率影响,或者需要写复杂shouldComponentUpdate进行判断。...render之后,组件使用组件中状态,导致组件props属性发生改变时候 也会触发组件更新 什么是 Reactrefs?

1.5K20

快速上手 React Hook

快速上手 React Hook Hook 是 React 16.8 新增特性。它可以让你在编写 class 情况下使用 state 以及其他 React 特性。...不同于 class 是,我们可以按照需要使用数字或字符串进行赋值,而不一定是对象。在示例中,只需使用数字来记录用户点击次数,所以我们传了 0 作为变量初始 state。...通过使用这个 Hook,你可以告诉 React 组件需要在渲染后执行某些操作。React 会保存你传递函数(我们将它称之为 “effect”),并且在执行 DOM 更新之后调用它。...然而,useRef() 比 ref 属性更有用。它可以「很方便地保存任何可变值」,类似于在 class 中使用实例字段方式。 这是因为它创建一个普通 Javascript 对象。...目前为止,在 React 中有两种流行方式来共享组件之间状态逻辑: render props 和高阶组件,现在让我们来看看 Hook 是如何在让你增加组件情况下解决相同问题

5K20
领券