Можно ли преобразовать строку в имя ссылочной переменной в реакции?

У меня есть ссылочная переменная:

const weightInputRef = useRef();
const weightInputRef = useRef();

У меня есть некоторые данные:

const inputs = [{
    ref: heightInputRef,
    type:'number',
    placeholder: 'Height',
    name: 'height'
  },
  {
    ref: weightInputRef,
    type:'number',
    placeholder: 'Weight',
    name: 'weight'
  }]

Я использую его для установки соединения между следующими элементами HTML:

{inputs.map((item, index) => <Input
  name = {inputs[index].name}
  placeholder = {inputs[index].placeholder}
  type = {inputs[index].type}
  inputRef = {inputs[index].ref}
/>
)}

Можно ли вместо этого отправить имя переменной напрямую? Нравиться:

ref=item.name+"InputRef"

Я думаю, что это может сэкономить много кода. Есть ли способ добиться этого?

Вот мой компонент ввода:

export default function Input(props) {
  return (
    <input
      className = {classes.input} 
      placeholder = {props.placeholder} 
      type = {props.type} 
      ref = {props.inputRef}
      name = {props.name}
    />
  )
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

РЕДАКТИРОВАТЬ Как указал Ник Парсонс, вы можете создать объект поиска для хранения ссылочных переменных и доступа к ним, используя их имена в качестве ключей. Вот окончательный компонент кода.

    import React, { useRef } from 'react';
    
    const heightInputRef = useRef();
    const weightInputRef = useRef();
    
    const inputRefs = {
  weight: weightInputRefs,
  height: heightInputRefs
    }
    
    const inputs = [
      { type: 'number',
        placeholder: 'Height',
        name: 'height'
      },
      { type: 'number',
        placeholder: 'Weight',
        name: 'weight'
      }
    ];
    
    export default function Input(props) {
      return (
        <input
          className = {classes.input}
          placeholder = {props.placeholder}
          type = {props.type}
          ref = {props.inputRef}
          name = {props.name}
        />
      );
    }
    
    function YourComponent() {
      return (
        <div>
          {inputs.map((item, index) => (
            <Input
              key = {index}
              name = {item.name}
              placeholder = {item.placeholder}
              type = {item.type}
              inputRef = {inputRefs[item.name]} // Access the reference variable from the lookup object
            />
          ))}
        </div>
      );
    }

есть ли побочные эффекты от использования этого метода именно таким образом?

Millennial 24.07.2023 08:35

@Millennial Как правило, вам лучше избегать использования eval, когда есть альтернативы (он может выполнять любой JS, поэтому вам нужно быть уверенным, что вы доверяете данным в item.name, например, если они исходят от пользовательского ввода, вы не можете доверяй этому). В этом случае есть лучший вариант, который заключается в создании объекта с вашими ссылками в них, они используют скобки для ссылки на них: stackoverflow.com/questions/5187530/…

Nick Parsons 24.07.2023 08:43

Это выглядит совсем не уместно. Избегайте специального использования eval при выполнении динамического значения, такого как item.name.

Osakr 24.07.2023 08:55

Спасибо @НикПарсонс. Я обновил код соответственно.

Muhammad Jawad Mansoor 24.07.2023 12:18
Ответ принят как подходящий

Как предложил Ник Парсонс:

Создание объекта с рефами:

const refsObject = {
  weight: weightInputRefs,
  height: heightInputRefs
}

измененный код может быть:

{inputs.map((item, index) => <Input
  ref = {refsObject[item.name]}
/>
)}

Другие вопросы по теме