Home  >  Article  >  Web Front-end  >  How Vue implements local scope & modularization

How Vue implements local scope & modularization

php中世界最好的语言
php中世界最好的语言Original
2018-06-09 10:45:211667browse

This time I will show you how Vue implements local scope & modularization, and what are the precautions for Vue to implement local scope & modularization. The following is a practical case, let's take a look.

CSS Modules gives each local class a globally unique class name so that component styles will not affect each other. For example:

/* button.css */
.button {
 font-size: 16px;
}
.mini {
 font-size: 12px;
}

It will be converted to something like this:

/* button.css */
.button__button--d8fj3 {
 font-size: 16px;
}
.button__mini--f90jc {
 font-size: 12px;
}

When importing a CSS module file, it will provide us with the mapping object of local class name to global class name. Like this:

import styles from './button.css'
// styles = {
// button: 'button__button--d8fj3',
// mini: 'button__mini--f90jc'
// }
element.innerHTML = '<button class="&#39; + styles.button + &#39; &#39; + styles.mini + &#39;" />'

vue-css-modules: Simplified class name mapping

The following is a button component using CSS Modules:

<template>
 <button :class="{
 &#39;global-button-class-name&#39;: true,
 [styles.button]: true,
 [styles.mini]: mini
 }">点我</button>
</template>
<script>
 import styles from './button.css'
 export default {
 props: { mini: Boolean },
 data: () => ({ styles })
 }
</script>

Indeed, CSS Modules is a good choice for Vue components. But there are also the following shortcomings:

  • You must pass in styles in data

  • You must use styles.localClassName to import the global class name

  • If there are other global class names, you must put them together

  • If you want to bind to the property value of the component, even if it is local The class name is the same as the attribute name, and must also be specified explicitly


##For the button component above, use vue-css-modules After:

<template>
 <button
 class="global-button-class-name"
 styleName="button :mini">
 点我
 </button>
</template>
<script>
 import CSSModules from 'vue-css-modules'
 import styles from './button.css'
 export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean }
 }
</script>
Now:

  • You don’t have to pass styles in data, but you have to pass styles in mixins:full_moon_with_face:

  • You can say goodbye to styles.localClassName

  • Put the local class name in the styleName attribute and the global class name in the class attribute, which is a lot more organized

  • The local class name binds the property of the component with the same name, just add: modifier in front of it

Modifier

@button

<button styleName="@button">按钮</button>
This is equivalent to:

<button styleName="button" data-component-button="true">按钮</button>
This allows you to reset the style of the component externally:

.form [data-component-button] {
 font-size: 20px;
}
$type

<button styleName="$type">按钮</button>
This is the same as:

<button :styleName="type">按钮</button>
:mini

<button styleName=":mini">按钮</button>
This is the same as:

<button :styleName="mini ? &#39;mini&#39; : &#39;&#39;">按钮</button>
disabled=isDisabled
<button styleName="disabled=isDisabled">按钮</button>
This is the same as:

<button :styleName="isDisabled ? &#39;disabled&#39; : &#39;&#39;">按钮</button>

Usage method

Use in the Vue template

Introduce the CSS module outside the template

<template>
 <button
 class="global-button-class-name"
 styleName="button :mini">
 点我
 </button>
</template>
<script>
 import CSSModules from 'vue-css-modules'
 import styles from './button.css'
 export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean }
 }
</script>
Use the CSS module inside the template

<template>
 <button
 class="global-button-class-name"
 styleName="button :mini">
 点我
 </button>
</template>
<script>
 import CSSModules from 'vue-css-modules'
 export default {
 mixins: [CSSModules()],
 props: { mini: Boolean }
 }
</script>
<style module>
 .button {
 font-size: 16px;
 }
 .mini {
 font-size: 12px;
 }
</style>
Used in Vue JSX

import CSSModules from 'vue-css-modules'
import styles from './button.css'
export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean },
 render() {
 return (
  <button styleName="@button :mini">点我</button>
 )
 }
}
Used in Vue rendering function

import CSSModules from 'vue-css-modules'
import styles from './button.css'
export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean },
 render(h) {
 return h('button', {
  styleName: '@button :mini'
 }, '点我')
 }
}
I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to php Chinese website Other related articles!

Recommended reading:

Use JS to operate pictures, leaving only black and white

Encapsulate the Vue2 routing navigation hook and use it in actual combat use

The above is the detailed content of How Vue implements local scope & modularization. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:vue custom componentNext article:vue custom component