ホームページ >ウェブフロントエンド >jsチュートリアル >Vue で合理化されたスタイルを実装する方法 (詳細なチュートリアル)
この記事では、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
//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('TodoList', {}) Vue.component('TodoItem', {}) //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/propsData2.コンポーネント以外のコンポーネントの知識が必要です)
data computed3. コンポーネントの種類 (コンポーネントのタイプを変更します)
watch 生命周期钩子 (按照它们被调用的顺序)4. テンプレート修飾子 (テンプレートのコンパイル方法を変更します)
methods5. テンプレートの依存関係 (コンポーネント内で使用されるリソース)テンプレート)
template/render renderError6. 組み合わせ (属性をオプションに結合する)
//bad props: ['status'] //good props: { status: String } //better props: { status: { type: String, required: true } }7. インターフェイス (コンポーネントのインターフェイス)
//bad props: {'greeting-text': 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 slot2.同じ要素の複数のバリエーション)
v-model3. 条件付きレンダリング (要素がレンダリング/表示されるかどうか)
v-on4. レンダリング方法 (要素のレンダリング方法を変更する)
v-html v-text5. グローバルな認識が必要コンポーネント)
//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('some-comp', { data: { foo: 'bar' } }) //good Vue.component('some-comp', { data: function () { return { foo: 'bar' } } })🎜7. 双方向バインディング (バインドとイベントの組み合わせ)🎜
//bad {{ fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') }} //good computed: { normalizedFullName: function () { return this.fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') } }🎜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('some-comp', { data: { foo: 'bar' } }) //good Vue.component('some-comp', { data: function () { return { foo: 'bar' } } })
【组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法】(强烈推荐)
//bad {{ fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') }} //good computed: { normalizedFullName: function () { return this.fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') } }
【应该把复杂计算属性分割为尽可能多的更简单的属性】(强烈推荐)
//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>
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
以上がVue で合理化されたスタイルを実装する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。