bus = new Vue()
хоть и прост, но чреват утечками памяти. Лучше делать шину через глобальный миксин, который по destroy автоматически очистит всех слушателей конкретного компонента. <select v-model="species">
data: {
species: '',
searchCharacter() {
return this.characters.filter((character) => {
return character.name.toLowerCase().includes(this.search.toLowerCase())
&& character.species.toLowerCase().includes(this.species.toLowerCase());
});
},
npm run build
(который react-scripts build
), либо делай npm run eject
и правь настоящий конфиг React'a. type Alph = 'Q' | 'W' | 'E' | 'R' | 'T' | 'Y' | 'U' | 'I' | 'O' | 'P' | 'A' | 'S' | 'D' | 'F' | 'G' | 'H' | 'J' | 'K' | 'L' | 'X' | 'Z' | 'C' | 'V' | 'B' | 'N' | 'M'
type CamelToSnake<T extends string> = T extends `${infer S1}${Alph}${string}` ? T extends `${S1}${infer S2}` ? `${Lowercase<S1>}_${CamelToSnake<Uncapitalize<S2>>}` : T : T;
type AsdSnake = CamelToSnake<'asdAsdAsd'> // asd_asd_asd
type SnakeToCamel<T extends string> = T extends `${infer S1}_${infer S2}` ? `${Lowercase<S1>}${Capitalize<SnakeToCamel<S2>>}` : T;
type AsdCamel = SnakeToCamel<'asd_asd_asd'> // asdAsdAsd
type SnakePropToCamel<T extends PropertyKey> = T extends string ? SnakeToCamel<T> : T;
type CamelPropToSnake<T extends PropertyKey> = T extends string ? CamelToSnake<T> : T;
let camelToSnakeCase: <T extends PropertyKey>(str: T) => CamelPropToSnake<T>;
type CamelObjectToSnake<T extends {[key: string]: any}> = {
[K in keyof T as CamelPropToSnake<K>]: T[K]
}
function camelCaseObject<T extends {[key: string]: any}>(obj: T) {
return Object.entries(obj)
.reduce((acc, [key, value]) =>
(acc[camelToSnakeCase(key as keyof T)] = value, acc),
{} as CamelObjectToSnake<T>
)
}
function camelToSnakeKeysOfArrayObject<T extends Array<{[key: string]: any}>>(arr: T) {
return arr.map(camelCaseObject) as {
[K in keyof T]: CamelObjectToSnake<T[K]>
};
}
camelToSnakeKeysOfArrayObject([{
aaAa: 1,
bbBb: true
}, {
aaAa: 'ggg'
}]);