ホームページ  >  記事  >  ウェブフロントエンド  >  Vue で合理化されたスタイルを実装する方法 (詳細なチュートリアル)

Vue で合理化されたスタイルを実装する方法 (詳細なチュートリアル)

亚连
亚连オリジナル
2018-06-08 18:04:431876ブラウズ

この記事では、Vue の合理化されたスタイルに関連する知識ポイントを説明し、興味のある友人が参照できるサンプル コードを共有します。

前にも書きましたが

Vue公式サイトのスタイルガイドは優先順位(必要、強く推奨、推奨、使用注意の順)で分類されており、コード間隔が広くて問い合わせが困難です。この記事はタイプ別に分類されており、いくつかの例や説明が省略されています

コンポーネント名

[コンポーネント名は複数の単語です] (必須)

コンポーネント名は常に複数の単語である必要があります。ルートコンポーネントApp。 これを行うと、すべての HTML 要素名が単一の単語であるため、既存および将来の HTML 要素との競合が回避されます

//bad
Vue.component('todo', {})
//good
Vue.component('todo-item', {})

[単一ファイルのコンポーネントのファイル名は、常に大文字で始まるか (PascalCase)、常に水平方向の行接続 (kebab-) にする必要があります。 case)] (強く推奨)

//bad
mycomponent.vue
//good
MyComponent.vue
//good
my-component.vue

[基本コンポーネント名は特定のプレフィックスで始まる必要があります] (強く推奨)

特定のスタイルと規則を適用する基本コンポーネント (つまり、ロジックやステートレス コンポーネントを持たない表示クラス) は、すべてBase、App、V

//bad
components/
|- MyButton.vue
|- VueTable.vue
|- Icon.vue
//good
components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue

などの特定のプレフィックスで始まります [アクティブなインスタンスを 1 つだけ持つ必要があるコンポーネントには、一意であることを示すためにプレフィックス The を付けて名前を付ける必要があります [強く推奨] The 前缀命名,以示其唯一性】(强烈推荐)

这不意味着组件只可用于一个单页面,而是每个页面只使用一次,这些组件永远不接受任何 prop

//bad
components/
|- Heading.vue
|- MySidebar.vue
//good
components/
|- TheHeading.vue
|- TheSidebar.vue

【和父组件紧密耦合的子组件应该以父组件名作为前缀命名】(强烈推荐)

//bad
components/
|- TodoList.vue
|- TodoItem.vue
|- TodoButton.vue
//good
components/
|- SearchSidebar.vue
|- SearchSidebarNavigation.vue

【组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾】(强烈推荐)

//bad
components/
|- ClearSearchButton.vue
|- ExcludeFromSearchInput.vue
|- LaunchOnStartupCheckbox.vue
|- RunSearchButton.vue
|- SearchInput.vue
|- TermsCheckbox.vue
//good
components/
|- SearchButtonClear.vue
|- SearchButtonRun.vue
|- SearchInputQuery.vue
|- SearchInputExcludeGlob.vue
|- SettingsCheckboxTerms.vue
|- SettingsCheckboxLaunchOnStartup.vue

【单文件组件和字符串模板中组件名应总是PascalCase——但在DOM模板中总是kebab-case】(强烈推荐)

//bad
<!-- 在单文件组件和字符串模板中 -->
<mycomponent/>
<myComponent/>
<!-- 在 DOM 模板中 -->
<MyComponent></MyComponent>
//good
<!-- 在单文件组件和字符串模板中 -->
<MyComponent/>
<!-- 在 DOM 模板中 -->
<my-component></my-component>

【组件名应该倾向于完整单词而不是缩写】(强烈推荐)

//bad
components/
|- SdSettings.vue
|- UProfOpts.vue
//good
components/
|- StudentDashboardSettings.vue
|- UserProfileOptions.vue

组件相关

【单文件组件、字符串模板和JSX中没有内容的组件应该自闭合——但在DOM模板里不要这样做】(强烈推荐)

自闭合组件表示它们不仅没有内容,而且刻意没有内容

//bad
<!-- 在单文件组件、字符串模板和 JSX 中 -->
<MyComponent></MyComponent>
<!-- 在 DOM 模板中 -->
<my-component/>
//good
<!-- 在单文件组件、字符串模板和 JSX 中 -->
<MyComponent/>
<!-- 在 DOM 模板中 -->
<my-component></my-component>

【为组件样式设置作用域】(必要)

这条规则只和单文件组件有关。不一定要使用 scoped

これは、コンポーネントが 1 つのページでのみ使用できるという意味ではありませんが、ページごとに 1 回しか使用できません。これらのコンポーネントは prop

//bad
<template><button class="btn btn-close">X</button></template>
<style>
.btn-close {background-color: red;}
</style>
//good
<template><button class="btn btn-close">X</button></template>
<style scoped>
.btn-close {background-color: red;}
</style>
//good
<template><button :class="[$style.button, $style.buttonClose]">X</button></template>
<style module>
.btn-close {background-color: red;}
</style>

[ および親コンポーネントを受け入れることはありません。密結合したサブコンポーネントには、親コンポーネント名をプレフィックスとして使用する] (強く推奨)

//good
<!-- ComponentA.vue -->
<script>/* ... */</script>
<template>...</template>
<style>/* ... */</style>

<!-- ComponentB.vue -->
<script>/* ... */</script>
<template>...</template>
<style>/* ... */</style>

[コンポーネント名は高レベル (通常は一般的な説明) の単語で始まり、説明的な修飾子で終わる必要があります] (強く推奨) 推奨)

//bad
Vue.component(&#39;TodoList&#39;, {})
Vue.component(&#39;TodoItem&#39;, {})
//good
components/
|- TodoList.vue
|- TodoItem.vue

[コンポーネント名単一ファイル コンポーネントおよび文字列テンプレートでは常に PascalCase である必要がありますが、DOM テンプレートでは常に kebab-case である必要があります] (強く推奨)

el

[コンポーネント名は略語ではなく完全な単語になる傾向があります] (強く推奨)

name
parent

コンポーネント関連

[JSX 内のコンテンツのない単一ファイル コンポーネント、文字列テンプレート、およびコンポーネントは自己終了である必要があります - ただし、DOM テンプレートではこれを行わないでください] (強く推奨)

自己終了コンポーネントとは、コンテンツがないだけではないことを意味しますですが、意図的にコンテンツを持たせません

functional

[コンポーネント スタイルのスコープを設定する] (必須)

このルールは、単一ファイル コンポーネントにのみ適用されます。 scoped 属性を使用する必要はありません。スコープの設定は、CSS モジュールを使用するか、他のライブラリや規約を使用して行うこともできます

delimiters
comments

[単一ファイル コンポーネントでは、3f1c4e4b6b16bbbd69b2ee476dc4f83a、d477f9ce7bf77f53fbcf36bec1b69b7a、c9ccee2e6ea535a969eb3f532ad9fe89 タグの順序が常に一貫している必要があります] (推奨) )

components
directives
filters

【1つのファイルにコンポーネントは1つだけ】(強く推奨)

extends
mixins

【コンポーネントオプションのデフォルトの順序】(推奨)

1. 副作用(コンポーネントの外側に効果を引き起こす)

inheritAttrs
model
props/propsData

2.コンポーネント以外のコンポーネントの知識が必要です)

data
computed

3. コンポーネントの種類 (コンポーネントのタイプを変更します)

watch
生命周期钩子 (按照它们被调用的顺序)

4. テンプレート修飾子 (テンプレートのコンパイル方法を変更します)

methods

5. テンプレートの依存関係 (コンポーネント内で使用されるリソース)テンプレート)

template/render
renderError

6. 組み合わせ (属性をオプションに結合する)

//bad
props: [&#39;status&#39;]
//good
props: {
 status: String
}
//better
props: {
 status: {
  type: String,
  required: true
 }
}

7. インターフェイス (コンポーネントのインターフェイス)

//bad
props: {&#39;greeting-text&#39;: String}
<WelcomeMessage greetingText="hi"/>
//good
props: {greetingText: String}
<WelcomeMessage greeting-text="hi"/>

8. イベント (リアクティブ イベントによってトリガーされるコールバック)

//bad
 <li v-for="todo in todos">
//good
 <li v-for="todo in todos":key="todo.id">

10. 非応答プロパティ(応答システムに依存しないインスタンスプロパティ)

//bad
<li v-for="user in users" v-if="user.isActive" :key="user.id" > {{ user.name }} <li>
//good
<li v-for="user in users" v-if="shouldShowUsers" :key="user.id" > {{ user.name }} <li>

11. レンダリング(コンポーネント出力の宣言的記述)

//bad
<img src="https://vuejs.org/images/logo.png">
//good
<img
 src="https://vuejs.org/images/logo.png"
 
>

prop

[Prop 定義はできるだけ詳細にする必要があります] (必須)

詳細 prop 定義には 2 つの利点があります: 1. コンポーネントの API を記述するため、コンポーネントの使用方法を理解しやすくなります。 2. 開発環境で、間違った形式の prop が提供された場合。潜在的なエラーの原因を見つけるのに役立つように、Vue は警告を発します

is

【props を宣言するとき、その名前付けには常にキャメルケースを使用する必要があり、テンプレートと JSX では常にケバブケースを使用する必要があります】(強く推奨)

v-for

ディレクティブと機能

【v-forと合わせてキーを使用する】(必須)

v-if
v-else-if
v-else
v-show
v-cloak

【同じ要素にv-ifとv-forを同時に使用しないでください】(必須)

v-pre
v-once

【複数の要素を持つ要素特徴は複数行で記述する必要があります] (強く推奨)

id

[要素特徴のデフォルトの順序] (推奨)

1. 定義 (コンポーネントのオプションを提供する)

ref
key
slot

2.同じ要素の複数のバリエーション)

v-model

3. 条件付きレンダリング (要素がレンダリング/表示されるかどうか)

v-on

4. レンダリング方法 (要素のレンダリング方法を変更する)

v-html
v-text

5. グローバルな認識が必要コンポーネント)

//bad
 methods: {update: function () { }}
//bad
 methods: {_update: function () { } }
//bad
 methods: {$update: function () { }}
//bad
 methods: {$_update: function () { }}
//good
 methods: { $_myGreatMixin_update: function () { }}

6. 固有の機能 (必須の固有値特性)🎜
//bad
Vue.component(&#39;some-comp&#39;, {
 data: {
  foo: &#39;bar&#39;
 }
})
//good
Vue.component(&#39;some-comp&#39;, {
 data: function () {
  return {
   foo: &#39;bar&#39;
  }
 }
})
🎜7. 双方向バインディング (バインドとイベントの組み合わせ)🎜
//bad
{{
 fullName.split(&#39; &#39;).map(function (word) {
  return word[0].toUpperCase() + word.slice(1)
 }).join(&#39; &#39;)
}}
//good
computed: {
 normalizedFullName: function () {
  return this.fullName.split(&#39; &#39;).map(function (word) {
   return word[0].toUpperCase() + word.slice(1)
  }).join(&#39; &#39;)
 }
}
🎜8. その他の特性 (すべての通常のバインドまたはアンバインド特性)🎜🎜9.イベント (コンポーネント イベント) リスナー)🎜
//bad
computed: {
 price: function () {
  var basePrice = this.manufactureCost / (1 - this.profitMargin)
  return (
   basePrice -
   basePrice * (this.discountPercent || 0)
  )
 }
}
//good
computed: {
 basePrice: function () {
  return this.manufactureCost / (1 - this.profitMargin)
 },
 discount: function () {
  return this.basePrice * (this.discountPercent || 0)
 },
 finalPrice: function () {
  return this.basePrice - this.discount
 }
}
🎜10. コンテンツ (要素のコンテンツをコピー)🎜
//good
props: {
 value: {
  type: String,
  required: true
 },

 focused: {
  type: Boolean,
  default: false
 }
}
🎜属性🎜🎜[プライベート属性名] (必須)🎜🎜プラグインでカスタマイズされたプライベート属性には、常に $_ 接頭辞を使用します。 ins、mixin、その他の拡張機能には、他の作成者 ($_yourPluginName_ など) との競合を避けるための名前空間が付属しています🎜
//bad
<style scoped>
button {
 background-color: red;
}
</style>
//good
<style scoped>
.btn-close {
 background-color: red;
}
</style>
🎜[コンポーネントのデータは関数である必要があります] (必須)🎜

当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数

//bad
Vue.component(&#39;some-comp&#39;, {
 data: {
  foo: &#39;bar&#39;
 }
})
//good
Vue.component(&#39;some-comp&#39;, {
 data: function () {
  return {
   foo: &#39;bar&#39;
  }
 }
})

【组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法】(强烈推荐)

//bad
{{
 fullName.split(&#39; &#39;).map(function (word) {
  return word[0].toUpperCase() + word.slice(1)
 }).join(&#39; &#39;)
}}
//good
computed: {
 normalizedFullName: function () {
  return this.fullName.split(&#39; &#39;).map(function (word) {
   return word[0].toUpperCase() + word.slice(1)
  }).join(&#39; &#39;)
 }
}

【应该把复杂计算属性分割为尽可能多的更简单的属性】(强烈推荐)

//bad
computed: {
 price: function () {
  var basePrice = this.manufactureCost / (1 - this.profitMargin)
  return (
   basePrice -
   basePrice * (this.discountPercent || 0)
  )
 }
}
//good
computed: {
 basePrice: function () {
  return this.manufactureCost / (1 - this.profitMargin)
 },
 discount: function () {
  return this.basePrice * (this.discountPercent || 0)
 },
 finalPrice: function () {
  return this.basePrice - this.discount
 }
}

【当组件开始觉得密集或难以阅读时,在多个属性之间添加空行可以让其变得容易】(推荐)

//good
props: {
 value: {
  type: String,
  required: true
 },

 focused: {
  type: Boolean,
  default: false
 }
}

谨慎使用

1、元素选择器应该避免在 scoped 中出现

在 scoped 样式中,类选择器比元素选择器更好,因为大量使用元素选择器是很慢的

//bad
<style scoped>
button {
 background-color: red;
}
</style>
//good
<style scoped>
.btn-close {
 background-color: red;
}
</style>

2、应该优先通过 prop 和事件进行父子组件之间的通信,而不是 this.$parent 或改变 prop

3、应该优先通过 Vuex 管理全局状态,而不是通过 this.$root 或一个全局事件总线

4、如果一组 v-if + v-else 的元素类型相同,最好使用 key (比如两个 e388a4556c0f65e1904146cc1a846bee 元素)

//bad
<p v-if="error">
 错误:{{ error }}
</p>
<p v-else>
 {{ results }}
</p>
//good
<p
 v-if="error"
 key="search-status"
>
 错误:{{ error }}
</p>
<p 
 v-else 
 key="search-results"
>
 {{ results }}
</p>

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

JavaScript的6种正则表达式(详细教程)

react webpack打包后的文件(详细教程)

在微信小程序中如何实现圆形进度条

以上がVue で合理化されたスタイルを実装する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。