Vue рдорд┐рд╢реНрд░рдг, рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ (BEM рд╕рдВрд╢реЛрдзрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛)


рдкреБрдП рдорд┐рдХреНрд╕рд┐рди рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реИред рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИрдВ рдЬрдм рддрдХ рдЖрдк рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдШрдЯрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЧрд╡рд╛рд╣реА рджреЗрдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред


рд▓рдХреНрд╖реНрдп


рд╣рдо рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдорд┐рдХреНрд╕рд┐рди рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдХреЛ рдПрдХ types рдирд╛рдо рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ baseClass рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ baseClass рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред


рдЗрд╕ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:


 <SampleComponent :types="['active', 'block']"></SampleComponent> 

рд╣рдо рдпрд╣ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ (рд╣рдорд╛рд░рд╛ baseClass sample-component )


 <div class="sample-component sample-component--active sample-component--block"></div> 

рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдХреЗрд╡рд▓ Vue рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рд╕реЗ рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╕рд┐рд░реНрдл рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдорд░реНрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдШрдЯрдХ рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ mods рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред


 // bemMods.js export default (baseClass) => ({ props: { types: { type: Array, default: () => [] } }, computed: { mods() { return this.types.map(type => `${baseClass}--${type}`); } } }) 

 // SampleComponent.vue <template> <div class="sample-component" :class="mods"><slot /></div> </template> 

 import bemMods from 'bemMods.js'; export default { name: 'SampleComponent', mixins: [ bemMods('sample-component') ] } 

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ:


  1. рд╣рд░ рдШрдЯрдХ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдбред (рдХрдо рд╕реЗ рдХрдо рд╡реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ)
  2. baseClass рддрд░реНрдХ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ред
  3. рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ mods рд╕рдВрдкрддреНрддрд┐ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИред
  4. рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╡ рд╣реИред

рд╣рдо рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред


рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рдорд┐рдХреНрд╕рд┐рди


Vue рдореЗрдВ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рддрдВрддреНрд░ рд╣реИ, рдЬрд┐рд╕реЗ Inject \ Prov рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджреВрд╖рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рдорд┐рдХреНрд╕рд┐рди рд╕реЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рдирд╛рдо рдХреЛ baseClass рд░реВрдк рдореЗрдВ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдПрдХ рдШрдЯрдХ рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо baseClass рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХрд╛ baseClass рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред


 // bemMods.js // Converts ComponentName to component-name const transformName = string => string.replace(/\s+/g, '-').toLowerCase(); const install = (Vue, { propName = 'types', modsName = 'mods' } = {}) => { Vue.mixin({ props: { // Prop name is now dynamic and allows to avoid conflits [propName]: { type: Array, default: () => [], } }, // Dependency injection forces us to explicitly require that function provide: { [modsName](baseClass) { baseClass = baseClass || transformName(this.$options.name); return (this[propName] || []).map(type => `${baseClass}--${type}`); } } }); }; export default { install }; 

рдЕрдм рд╣рдо рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЕрдкрдирд╛ рдкреНрд▓рдЧрдЗрди рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред


 import Vue from 'vue'; import bemMods from 'bemMods.js'; Vue.use(bemMods); 

рд╣рдо рдпрд╣ рднреА рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


 import Vue from 'vue'; import bemMods from 'bemMods.js'; Vue.use(bemMods, { propName: 'modifiers', modsName: 'classes' }); 

рдФрд░ рдпрд╣рд╛рдБ рдХреИрд╕реЗ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдорд┐рд╢реНрд░рдг refactoring рдХреЗ рдмрд╛рдж рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:


 <template> <div class="sample-component" :class="mods"><slot /></div> </template> 

 export default { name: 'SampleComponent', // Explicit property inject: ['mods'] } 

рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХрд╛ name рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЙрд╕рдХреЗ name рд╕реЗ рдЕрд▓рдЧ baseClass рд╣реИ:


 <template> <div class="special-component" :class="mods('snowflake')"><slot /></div> </template> 

 export default { name: 'SpecialComponent', inject: ['mods'] } 

рдпрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░рд┐рдВрдЧ рдпрд╛ рдкреНрд▓рдЧрдЗрди рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 export default { name: 'SomeComponent', inject: { // If mixin export property changes name it's now possible to replace it in every single component instance withouth any additional rework 'mods': { // In this case 'mods' becomes 'classes' from: 'classes', } } } 

рдЖрдк рдирд╛рдо рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Symbol рдЙрдкрдпреЛрдЧ рдПрдХ mods рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╣рд░ рдПрдХ рдШрдЯрдХ рдореЗрдВ рдЙрд╕ рдкреНрд░рддреАрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдБ рдЖрдк bemMods рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рд╣рдордиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдк рдирд╛рдо рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдореБрдЦреНрдп рдорд┐рд╢реНрд░рдг рд╕реАрдорд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд╕реНрдЯрдо рдкреНрд░реЛрдк рдирд╛рдо рдХреЗ рд╕рд╛рде рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред


рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛ рдФрд░ рдЖрдкрдХреЛ Vue рдХреЗ рд▓рд┐рдП рдорд┐рдХреНрд╕рд┐рдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi441540/


All Articles