Как я могу упростить этот избыточный код React в компоненте?

#javascript #reactjs #ecmascript-6

#javascript #reactjs #ecmascript-6

Вопрос:

Итак, у меня есть текстовые поля пользовательского интерфейса Material, которые получают некоторые данные из API, и вот мой код. Это работает отлично, но я хочу упростить его, и я понятия не имею, как это сделать. Я думал об использовании map, но не уверен, как обращаться с вложенными z элементами. Любая помощь была бы высоко оценена!

P.S. Я новичок.

              <div>
              <TextField value={queryCache.getQueryData('x1').y1}/>
              <TextField value={queryCache.getQueryData('x1').y2}/>
              <TextField value={queryCache.getQueryData('x1').y3.z1}/>
              <TextField value={queryCache.getQueryData('x1').y3.z2}/>
              <TextField value={queryCache.getQueryData('x1').y4}/>
              ...
            </div>   

Комментарии:

1. Вы можете создать функцию, которая возвращает компонент TextField. Во-вторых, вы можете заполнить значения в массиве . Затем вы должны выполнить итерацию компонента TextField с массивом значений.

2. @AhmadSuddle Я не совсем уверен, что вы имеете в виду, не могли бы вы, пожалуйста, показать мне пример? Спасибо!

3. Что-то вроде data = queryCache.getQueryData('x1'); , values = [data.y1, data.y2, data.y3.z1, ...]; , а затем {values.map(value => <TextField value={value} />} .

4. @epsiloneel, есть ли какой-либо конкретный шаблон, для которого мы должны получить z-элемент?

5. @DrewReese спасибо за ваш ответ, это имеет смысл, но теперь я не уверен, где определить эти значения, поскольку мой queryCache.getQueryData('x') обновляется асинхронно из-за перехвата мутации. Не могли бы вы, пожалуйста, помочь мне и с этим? Большое спасибо!

Ответ №1:

Похоже, queryCache.getQueryData('x1') это своего рода «коллекция», которая содержит несколько значений, доступных по разным путям.

Что вы могли бы сделать, это определить список этих путей и выполнить итерацию по ним, получая необходимые значения:

 const paths = [
  [ "y1" ], // [ "name" ]
  [ "y2" ], // [ "age" ]
  [ "y3", "z1" ], // [ "location", "country" ]
  [ "y3", "z2" ], // [ "location", "city" ]
  [ "y4" ], // [ "occupation" ]
];

function getValue(collection, path) {
  return path.reduce((subCollection, key) => subCollection[key], collection);
}

// Examples:
// getValue({ name: "John" }, [ "name" ])
// => "John"
// getValue({ location: { country: "US", city: "NYC" } }, [ "location", "city" ])
// => "NYC"
  
 <div>
  {paths.map((path) => (
    <TextField value={getValue(queryCache.getQueryData('x1')), path} key={path.join(",")} />
  ))}
</div>
  

Я бы также предложил а) ввести queryCache.getQueryData('x1') переменную и повторно использовать ее, а не пересчитывать каждый раз, и б) придумать что-то получше key .

Ответ №2:

Итак, с помощью @DrewReese мне удалось разобраться с этим и заставить его работать. Вот решение для дальнейшего использования.

Я убрал логику за пределы return(), и это помогло мне создать не избыточный код.

 const data = queryCache.getQueryData("x");
const values = [
  data.y1,
  data.y2.z1,
  data.y2.z2,
  data.y2.z3,
  data.y3,
  data.y4,
......
];
  

И затем просто в моем заявлении return для JSX у меня есть то, что предложил @DrewReese:

 {values.map((value) => (
      <TextField value={value} />
    ))}
  

Примечание: я изменил значения на x / y / z, поскольку это конфиденциальная информация, которая не может быть общедоступной.

Спасибо за всю помощь!

Ответ №3:

Это должно сработать:

   const coordinates = [
        {
            x: x1,
            y: y1
        },
        {
            x: x2,
            y: y2
        },
        {
            x: x3,
            y: y3,
            z: z1
        },
        {
            x: x4,
            y: y3,
            z: z2
        },
        {
            x: x5,
            y: y4
        },
    ]

    coordinates.map(({x, y, z}) => (
        <TextField value={z ? queryCache.getQueryData(x)[y][z] : queryCache.getQueryData(x)[y] } />
    ))

  

Комментарии:

1. Привет, спасибо за ваш ответ и время, которое вы потратили, чтобы ответить мне, но это просто не сработало бы, потому что мне нужно было бы снова жестко закодировать, и это выглядело бы так же с избыточностью по-другому.

2. Не могли бы вы, пожалуйста, добавить структуру ваших данных?