Как поместить пустой массив в строку шаблона - PullRequest
1 голос
/ 13 мая 2019

Я хочу создать функцию, которая генерирует некоторый код реакции для меня

вот моя функция, он берет объект и создает для меня кучу хуков useState ()

var fromStateToHook = (obj) => {
    return Object.entries(obj).reduce((acc, [key,value]) => {
        return [...acc, [`const [${key}, 
        set${key.slice(0,1).toUpperCase() + key.slice(1)}] = useState('${value}');`]];
    }, []).join("\n")
}

когда я использую это так

copy(fromStateToHook( {
    images: [],
}))

Я вернусь

const [images, setImages] = useState('');

Я хочу получить это вместо

const [images, setImages] = useState([]);

Есть ли способ поместить массив в строку шаблона?

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

Массив должен быть «строковым» так, как вы ожидаете, что он будет записан.Предполагая, что это одномерный массив, Array.join будет делать

const numbers = [1, 2, 3, 4];
const template = `useState([${numbers.join(',')}])`
console.log(template); // useState([1,2,3,4])
1 голос
/ 13 мая 2019

Вы можете потенциально использовать JSON.stringify:

set${key.slice(0,1).toUpperCase() + key.slice(1)}] = useState(${JSON.stringify(value)});`]];

Это действительно зависит от того, как вы хотите, чтобы значение было напечатано (преобразовано в текст).Если ваши потребности более сложны, вам придется придумать собственный механизм строкового преобразования для значения.

0 голосов
/ 13 мая 2019

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

  function useStates(obj) {
    const result = {};
    for(const [key, value] of Object.entries(obj)) {
      const [stored, setter] = useState(value);
      result[key] = stored;
      result["set" + key[0].toUpperCase() + key.slice(1)] = setter;
    }
   return result;
 }

 const { images, setImages, names, setNames } = useStates({ images: [], names: [] });
...