Йо-йо! Недавно столкнулся с тем, что нужно передавать в компонент строку стилей и делать из неё объект стилей для того, чтобы применить их к элементу. Это было вызвано тем, что ранее использовался styled-components (ненавижу его… ) во множестве компонентов, которые вызывали один и тот же компонент, а он писал css, полученный из props в компонент через styled.
Так как я не хотел переопределять вызов кучи компонентов, я решил создать функцию, которая будет брать переданную строку, делать из неё объект и применять к элементу.
function xakplStyleStringToStyleObject(customStyling){ if(typeof(customStyling) === 'string'){ if(customStyling.length !== 0){ const arrStyle = customStyling.split(';').filter(e=>e.length !== 0).map((line)=>{ let result = Array.from(line.split(':')[0].matchAll(/-/g)); result.map((arr)=>{ line = Array.from(line).map((a, i)=>( (i === arr.index + 1) ? a.toUpperCase() : a )).join(''); }); line = [ line.split(':')[0].replace(/-/g, ''), line.slice(1).split(':').slice(1).join(':')].join(': '); return line; }); const rObj = {}; arrStyle.map((line)=>{ const a = line.split(':'); const name = a[0].trim(); rObj[name] = a.slice(1).join(':').trim().toString(); return line; }); return rObj; } else { return {}; } } else if(!Array.isArray(customStyling) && typeof(customStyling) === 'object'){ return customStyling; } else { return {}; } }
// input "background-image: url('https://example.com/image.png'); z-index:1; border-bottom-radius:4px"; // return { backgroundImage: "url('https://example.com/image.png')", borderBottomRadius: "4px", zIndex: "1" }
Если вам нужно единоразово преобразовать ваши стили в объект, то можете использовать для этого специальный сервис, который я сделал. Кстати, там ещё появился сервис для преобразования строки в camelCase
Так как с такой лажей я столкнулся впервые, мне сразу же показалось, что это лютый дерьмокод, потому что во-первых она захламляет код компонента, а во-вторых его синтаксис делает код менее читаемым из-за того, что становится непонятно где дочерние компоненты, а где простые элементы.
Далее я нашёл ещё несколько причин по которым он ху… не хороший. Вот они:
Ещё одной странностью для меня стало изменение стилей в зависимости от props. Привычным в вёрстке является то, что нужно добавить какой-то вспомогательный класс, а не менять его. Это неминуемо усложнит процесс работы, если вам пришёл свёрстанный файл.
Исходя из моего понимания проблем styled’а, я пришёл к выводу, что его можно использовать только если у вас «стихийная» разработка проекта, который «запустили и забыли». В ином случае использовать styled-components явно дурной тон. Как я уже говорил:
styled-components — тупое дерьмо тупого дерьма.