diff --git a/README-CN.md b/README-CN.md index ea5d555..9d12300 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,12 +1,16 @@ # Vue.js 组件编码规范 +> 这个 [链接](https://github.com/sqrthree/vuejs-component-style-guide/compare/master...pablohpsilva:master) 用来查看本翻译与英文版是否有差别(如果你没有看到 README.md 发生变化,那就意味着这份翻译文档是最新的)。 +

### 其它语言 + * [英文](https://pablohpsilva.github.io/vuejs-component-style-guide/#/) * [葡萄牙语](https://pablohpsilva.github.io/vuejs-component-style-guide/#/portuguese) +* [日本](https://pablohpsilva.github.io/vuejs-component-style-guide/#/japanese) * [韩语](https://pablohpsilva.github.io/vuejs-component-style-guide/#/korean) * [俄语](https://pablohpsilva.github.io/vuejs-component-style-guide/#/russian) @@ -25,7 +29,6 @@ * [基于模块开发](#基于模块开发) * [vue 组件命名](#vue-组件命名) - * [组件表达式简单化](#组件表达式简单化) * [组件 props 原子化](#组件-props-原子化) * [验证组件的 props](#验证组件的-props) @@ -38,6 +41,8 @@ * [提供组件 API 文档](#提供组件-api-文档) * [提供组件 demo](#提供组件-demo) * [对组件文件进行代码校验](#对组件文件进行代码校验) +* [只在需要时创建组件](#只在需要时创建组件) + ## 基于模块开发 @@ -155,11 +160,11 @@ Vue.js 的表达式是 100% 的 Javascript 表达式。这使得其功能性很 + :min="0" + :max="100" + :step="5" + @on-slide="updateInputs" + @on-end="updateResults"> @@ -214,11 +219,13 @@ Vue.js 的表达式是 100% 的 Javascript 表达式。这使得其功能性很 在 Vue.js 组件上下文中,`this`指向了组件实例。因此当你切换到了不同的上下文时,要确保 `this` 指向一个可用的 `component` 变量。 -换句话说,不要在编写这样的代码 `const self = this;` ,而是应该直接使用变量 `component`。 +换句话说,如果你正在使用 **ES6** 的话,就不要再编写 `var self = this;` 这样的代码了,您可以安全地使用 Vue 组件。 ### 为什么? -* 将组件 `this` 赋值给变量 `component`可用让开发者清楚的知道任何一个被使用的地方,它代表的是组件实例。 +* 使用 **ES6**,就不再需要将 `this` 保存到一个变量中了。 +* 一般来说,当你使用箭头函数时,会保留 `this` 的作用域。(译者注:箭头函数没有它自己的 this 值,箭头函数内的 this 值继承自外围作用域。) +* 如果你没有使用 **ES6**,当然也就不会使用 `箭头函数` 啦,那你必须将 “this” 保存到到某个变量中。这是唯一的例外。 ### 怎么做? @@ -282,7 +289,9 @@ export default { export default { // 不要忘记了 name 属性 name: 'RangeSlider', - // 组合其它组件 + // 使用组件 mixins 共享通用功能 + mixins: [], + // 组成新的组件 extends: {}, // 组件属性、变量 props: { @@ -324,14 +333,14 @@ Vue.js 提供的处理函数和表达式都是绑定在 ViewModel 上的,组 * 事件名也使用连字符命名。 * 一个事件的名字对应组件外的一组意义操作,如:upload-success、upload-error 以及 dropzone-upload-success、dropzone-upload-error (如果需要前缀的话)。 -* 事件命名应该以动词(如 client-api-load) 或是 形容词(如 drive-upload-success)结尾。([出处](https://github.com/GoogleWebComponents/style-guide#events)) +* 事件命名应该以动词(如 client-api-load) 或是 名词(如 drive-upload-success)结尾。([出处](https://github.com/GoogleWebComponents/style-guide#events)) [↑ 回到目录](#目录) ## 避免 this.$parent -Vue.js 支持组件嵌套,并且子组件可访问父组件的上下文。访问组件之外的上下文违反了[基于模块开发](基于模块开发)的[第一原则](https://addyosmani.com/first/)。因此你应该尽量避免使用 **`this.$parent`**。 +Vue.js 支持组件嵌套,并且子组件可访问父组件的上下文。访问组件之外的上下文违反了[基于模块开发](#基于模块开发)的[第一原则](https://addyosmani.com/first/)。因此你应该尽量避免使用 **`this.$parent`**。 ### 为什么? @@ -379,7 +388,7 @@ Vue.js 支持通过 `ref` 属性来访问其它组件和 HTML 元素。并通过

Basic Modal

- +
@@ -538,7 +547,7 @@ range slider 组件可通过拖动的方式来设置一个给定范围内的数 ### 怎么做? -为了校验工具能够校验 `*.vue`文件,你需要将代码编写在 ` +``` + [↑ 回到目录](#目录) --- diff --git a/README-FA.md b/README-FA.md new file mode 100644 index 0000000..a934266 --- /dev/null +++ b/README-FA.md @@ -0,0 +1,736 @@ +# راهنمای سبک نگارش کامپوننت ویو جی اس + +

+ +

+ +### ترجمه ها + +- [پرتغالی برزیلی](https://pablohpsilva.github.io/vuejs-component-style-guide/#/portuguese) +- [چینی](https://pablohpsilva.github.io/vuejs-component-style-guide/#/chinese) +- [ژاپنی](https://pablohpsilva.github.io/vuejs-component-style-guide/#/japanese) +- [کره ای](https://pablohpsilva.github.io/vuejs-component-style-guide/#/korean) +- [روسی](https://pablohpsilva.github.io/vuejs-component-style-guide/#/russian) +- [فارسی](https://pablohpsilva.github.io/vuejs-component-style-guide/#/farsi) + +## هدف + +این راهنما یک راه یکسان برای ساختار دادن به کد [ویو جی اس](http://vuejs.org/) شما است و موارد زیر را ممکن می سازد: + +- برای توسعه دهندگان و اعضای تیم درک کردن و متوجه شدن موضوعات آسان تر می شود. +- برای محیط های یکپارچه توسعه، تفسیر کد و فراهم کردن پشتیبانی آسان تر می شود. +- استفاده از ابزار های بیلد آسان تر می شود. +- نهان سازی و ارائه بسته های کد به طور جداگانه آسان تر می شود. + +این راهنما از مخزن [RiotJS Style Guide](https://github.com/voorhoede/riotjs-style-guide) که توسط [De Voorhoede](https://github.com/voorhoede) نوشته شده است الهام گرفته شده است. + +## فهرست مطالب + +- [توسعه مبتنی بر ماژول](#توسعه-مبتنی-بر-ماژول) +- [نام های کامپوننت ویو](#نام-های-کامپوننت-ویو) +- [کد های کامپوننت را ساده نگه دارید](#کد-های-کامپوننت-را-ساده-نگه-دارید) +- [پراپ های کامپوننت را ساده نگه دارید](#پراپ-های-کامپوننت-را-ساده-نگه-دارید) +- [از پراپ های کامپوننت استفاده بهینه کنید](#از-پراپ-های-کامپوننت-استفاده-بهینه-کنید) +- [`this` را به `کامپوننت` نسبت دهید](#this-را-به-کامپوننت-نسبت-دهید) +- [ساختار کامپوننت](#ساختار-کامپوننت) +- [نام های ایونت کامپوننت](#نام-های-ایونت-کامپوننت) +- [از استفاده کردن از `this.$parent` پرهیز کنید](#avoid-thisparent) +- [از `this.$refs` با احتیاط استفاده کنید](#use-thisrefs-with-caution) +- [از نام کامپوننت به عنوان محدوده style استفاده کنید](#از-نام-کامپوننت-به-عنوان-محدوده-style-استفاده-کنید) +- [برای ای پی آی کامپوننت خود مستند بنویسید](#برای-ای-پی-آی-کامپوننت-خود-مستند-بنویسید) +- [دمو کامپوننت را اضافه کنید](#دمو-کامپوننت-را-اضافه-کنید) +- [فایل های کامپوننت خود را لینت کنید](#فایل-های-کامپوننت-خود-را-لینت-کنید) +- [کامپوننت ها را زمانی بسازید که به آن ها نیاز دارید](#کامپوننت-ها-را-زمانی-بسازید-که-به-آن-ها-نیاز-دارید) + + + +## توسعه مبتنی بر ماژول + +همیشه برنامه خود را با استفاده از ماژول های کوچکی که فقط یک کار و آن کار را هم درست انجام می دهند، بسازید. + +ماژول یک بخش کوچک و مستقل از یک برنامه است. کتابخانه ویو جی اس به طور مشخص برای کمک کردن برای ساخت _ماژول های view-logic_ طراحی شده است . + +### چرا؟ + +یادگیری، درک کردن، نگهداری، استفاده مجدد و رفع مشکلات ماژول های کوچک، چه برای خود شما و چه برای توسعه دهندگان دیگر راحت تر می شود. + +### + +هر کامپوننت ویو (مثل یک ماژول) باید [در ابتدا](https://addyosmani.com/first/): _دارای یک هدف مشخص_ ([تک وظیفه‌ای](http://en.wikipedia.org/wiki/Single_responsibility_principle))، _مستقل_، _قابل استفاده مجدد_، _کوچک_ و _با قابلیت تست_ باشد. + +اگر کامپوننت شما کار های زیادی انجام می دهد و یا خیلی بزرگ شده است آن را به کامپوننت های کوچکتر تقسیم کنید به طوری که هر کدام فقط یه کار را انجام دهند و بر حسب تجربه، تلاش کنید که فایل هر کامپوننت کمتر از 100 خط کد باشد. +همچنین مطمئن شوید کامپوننت های شما به صورت مستقل از هم کار می کنند، برای مثال یک دمو مستقل برای آن قرار دهید. + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## نام های کامپوننت ویو + +نام هر کامپوننت باید موارد زیر را شامل شود: + +- **پر معنا**: نه بیش از حد دقیق و نه بیش از حد خلاصه شده و انتزاعی باشد. +- **کوتاه**: 2 یا 3 کلمه. +- **قابل تلفظ**: زیرا ما می خواهیم درباره آن حرف بزنیم و اسم آن را به زبان بیاوریم. + +همچنین نام هر کامپوننت ویو باید مطابق موارد زیر باشد: + +- **مطابق با تعریف عنصر سفارشی**: [شامل خط فاصله باشد](https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name), و از نام های رزرو شده استفاده نشده باشد. +- **`app-` namespaced**: نام باید عمومی و از طرف دیگر شامل یک کلمه باشد که بتوان به راحتی از آن در پروژه های دیگر استفاده مجدد کرد. + +### چرا؟ + +- از نام برای ارتباط برقرار کردن با کامپوننت استفاده می شود. پس باید کوتاه، پر معنا و قابل تلفظ باشد. + +### با چه روشی؟ + +```html + + + + + + + + + + + + + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## کد های کامپوننت را ساده نگه دارید + +کد های خطی ویو جی اس کلا جاوا اسکریپت هستند. و این قضیه آن ها را به شدت قدرتمند می سازد، اما ذاتا پیچیده هستند. بنابرین شما باید **کد های خطی را ساده نگه دارید**. + +### چرا؟ + +- خواندن کد های خطی پیچیده، سخت است. +- کد های خطی پیچیده نمی توانند در جای دیگر مورد استفاده مجدد قرار بگیرند که این می تواند منجر به تکرار و پوسیدگی کدها شود. +- محیط های یکپارچه توسعه، معمولا پشتیبانی برای سینتکس های کد های خطی ندارد، بنابراین نمی توانند به طور خودکار تکمیل یا اعتبار سنجی شوند. + +### با چه روشی؟ + +اگر کد خیلی پیچیده شد و یا خواندن آن سخت شد، **شما می بایست کد را به methods یا computed انتقال دهید**! + +```html + + + + + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## پراپ های کامپوننت را ساده نگه دارید + +در حالی که ویو جی اس به خاطر ویژگی هایش از ارسال آبجکت های پیچیده جاوا اسکریپتی پشتیبانی می کند شما باید تلاش کنید تا **پراپ های کامپوننت را تا جای ممکن ساده نگه دارید**. تلاش کنید تا فقط از [داده های اولیه جاوا اسکریپت](https://developer.mozilla.org/en-US/docs/Glossary/Primitive) که شامل (رشته ها، اعداد، بولین) و توابع می شوند، استفاده کنید. و از آبجکت های پیچیده پرهیز کنید. + +### چرا؟ + +- زمانی از یک اتریبیوت به طور جداگانه برای هر پراپ استفاده می کنیم، کامپوننت ای پی آی واضح و صریحی دارد; +- با استفاده کردن از داده های اولیه و توابع به عنوان مقادیر پراپ ها، ای پی آی های کامپوننت ما شبیه به ای پی آی های عنصر های بومی اچ تی ام ال 5 می شود; +- با استفاده کردن از اتریبیوت ها به ازای هر پراپ، بقیه توسعه دهندگان به راحتی می توانند بفهمند که چه چیز هایی به نمونه کامپوننت ارسال شده است. +- زمانی که آبجکت های پیچیده را ارسال می کنید، واضح نیست که چه ویژگی ها و متود هایی از آبجکت واقعا مورد استفاده کامپوننت های سفارشی قرار گرفته است. این باعث می شود ریفکتور کردن کد سخت شود و کد ها به سمت پوسیده شدن بروند. + +### با چه روشی؟ + +به ازای هر اتریبیوت برای کامپوننت، از یک پراپ استفاده کنید، که مقدارشان داده اولیه یا تابع باشد: + +```html + + + + + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## از پراپ های کامپوننت استفاده بهینه کنید + +در ویو جی اس پراپ های کامپوننت، ای پی آی شما هستند. یک ای پی آی منسجم و قابل پیش بینی، استفاده از کامپوننت شما را برای بقیه توسعه دهندگان راحت می کند. + +پراپ های کامپوننت از طریق اتریبیوت های اچ تی ام ال ارسال می شوند. مقادیر این اتریبیوت ها می تواند رشته های ساده ویو جی اس (`:attr="value"` یا `v-bind:attr="value"`) باشد یا به طور کامل صرف نظر شود. شما باید **پراپ های کامپوننت کنترل کنید** تا بتوانید سناریو های مختلف را امکان پذیر کنید. + +### چرا؟ + +کنترل کردن پراپ های کامپوننت به شما اطمینان می دهند کامپوننت شما همیشه به درستی کار کند (برنامه نویسی تدافعی). حتی اگر بقیه توسعه دهندگان، در زمانی دیگر از کامپوننت های شما به شیوه دیگری استفاده کنند که شما فکرش را از قبل نکرده بودید. + +### با چه روشی؟ + +- از پیش فرض ها برای مقادیر پراپ ها استفاده کنید +- از گزینه `type` برای [اعتبارسنجی](http://vuejs.org/v2/guide/components.html#Prop-Validation) مقادیر به منظور دریافت نوع مورد انتظار استفاده کنید.**[1\*]** +- قبل از استفاده کردن از پراپ ها، بررسی کنید تا ببینید پراپ ها وجود داشته باشند. + +```html + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## `this` را به `کامپوننت` نسبت دهید + +در داخل فضای عنصر کامپوننت ویو جی اس، `this` به نمونه کامپوننت اشاره می کند. +بنابراین زمانی که شما نیاز دارید در فضای دیگری ارجاع دهید، اطمینان پیدا کنید که `this` به عنوان `کامپوننت` در دسترس باشد. + +به عبارت دیگر: اگر میخواهید از استاندارد **ES6** استفاده کنید، چیز هایی شبیه `var self = this;` را دیگر **ننویسید**. شما با این کار، از کامپوننت های ویو به صورت ایمن استفاده می کنید. + +### چرا؟ + +- با استفاده از در استاندارد ES6، نیازی نیست `this` را در یک متغیر ذخیره کنیدک + -در کل، زمانی که از توابع Arrow استفاده می کنیم اسکوپ لکسیکال حفظ می شود. +- اگر شما از استاندارد ES6 استفاده **نمی کنید**، بنابراین از توابع Arrow هم استفاده نمی کنید پس شما می بایست `this` را به یک متغیر نسبت دهید. این تنها حالت استثنا می باشد. + +### با چه روشی؟ + +```html + + + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## ساختار کامپوننت + +این دستورالعمل ها را دنبال کنید تا چگونگی آن را دریابید. + +### چرا؟ + +- داشتن خروجی کامپوننت منجر به یک آبجکت گروه بندی شده و تمیز می شود، که باعث می شود خواندن کد آسان شود و توسعه دهندگان کد استانداردی را داشته باشند. +- چینش properties، data، computed، watches، و methods بر اساس حروف الفبا باعث می شود پیدا کردن آن ها آسان تر شود. +- دوباره می گوییم، گروه بندی کردن باعث می شود خوانایی کامپوننت بیشتر شود. (name; extends; props، data و computed; components; watch و methods; lifecycle methods، و غیره.); +- Use the `name` attribute. Using [vue devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en) and that attribute will make your development/testing easier; +- از متودولوژی های نامگذاری سی اس اس استفاده کنید ، مانند [BEM](https://medium.com/tldr-tech/bem-blocks-elements-and-modifiers-6b3b0af9e3ea#.bhnomd7gw), یا [rscss](https://github.com/rstacruz/rscss) - [details?](#use-component-name-as-style-scope); +- از ساختار فایل .vue و template-script-style استفاده کنید, همان طور که توسط Evan You خالق ویو پیشنهاد شده است. + +### با چه روشی؟ + +ساختار کامپوننت: + +```html + + + + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## Component event names + +Vue.js provides all Vue handler functions and expressions are strictly bound to the ViewModel. Each component events should follow a good naming style that will avoid issues during the development. See the **Why** below. + +### چرا؟ + +- Developers are free to use native likes event names and it can cause confusion down the line; +- آزادی برای نام گذاری ایونت ها میتواند به مورد رو به رو منجر شود [DOM ناسازگاری الگو های](https://vuejs.org/v2/guide/components.html#DOM-Template-Parsing-Caveats); + +### با چه روشی؟ + +- نام ایونت ها باید kebab-cased باشد; +- A unique event name should be fired for unique actions in your component that will be of interest to the outside world, like: upload-success, upload-error or even dropzone-upload-success, dropzone-upload-error (if you see the need for having a scoped prefix); +- Events should either end in verbs in the infinitive form (e.g. client-api-load) or nouns (e.g drive-upload-success) ([source](https://github.com/GoogleWebComponents/style-guide#events)); + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## Avoid `this.$parent` + +Vue.js supports nested components which have access to their parent context. Accessing context outside your vue component violates the [FIRST](https://addyosmani.com/first/) rule of [component based development](#module-based-development). Therefore you should **avoid using `this.$parent`**. + +### چرا؟ + +- A vue component, like any component, must work in isolation. If a component needs to access its parent, this rule is broken. +- If a component needs access to its parent, it can no longer be reused in a different context. + +### با چه روشی؟ + +- Pass values from the parent to the child component using attribute/properties. +- Pass methods defined on the parent component to the child component using callbacks in attribute expressions. +- Emit events from child components and catch it on parent component. + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## Use `this.$refs` with caution + +Vue.js supports components to have access to other components and basic HTML elements context via `ref` attribute. That attribute will provide an accessible way through `this.$refs` to a component or DOM element context. In most cases, the need to access **other components** context via `this.$refs` could be avoided. This is why you should be careful when using it to avoid wrong component APIs. + +### چرا؟ + +- A vue component, like any component, **must work in isolation**. If a component does not support all the access needed, it was badly designed/implemented. +- Properties and events should be sufficient to most of your components. + +### با چه روشی؟ + +- Create a good component API. +- Always focus on the component purpose out of the box. +- Never write specific code. If you need to write specific code inside a generic component, it means its API isn't generic enough or maybe you need a new component to manage other cases. +- Check all the props to see if something is missing. If it is, create an issue or enhance the component yourself. +- Check all the events. In most cases developers forget that Child-Parent communication (events) is needed, that's why they only remember the Parent-Child communication (using props). +- **Props down, events up!** Upgrade your component when requested with a good API and isolation as goals. +- Using `this.$refs` on components should be used when props and events are exhausted and having it makes sense (see the example below). +- Using `this.$refs` to access DOM elements (instead of doing `jQuery`, `document.getElement*`, `document.queryElement`) is just fine, when the element can't be manipulated with data bindings or for a directive. + +```html + + +``` + +```html + + +

Basic Modal

+ +
+ + + + + + +``` + +```html + + + + +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## از نام کامپوننت به عنوان محدوده style استفاده کنید + +Vue.js component elements are custom elements which can very well be used as style scope root. +Alternatively the component name can be used as CSS class namespace. + +### چرا؟ + +- Scoping styles to a component element improves predictability as its prevents styles leaking outside the component element. +- Using the same name for the module directory, the Vue.js component and the style root makes it easy for developers to understand they belong together. + +### با چه روشی؟ + +Use the component name as a namespace prefix based on BEM and OOCSS **and** use the `scoped` attribute on your style class. +The use of `scoped` will tell your Vue compiler to add a signature on every class that your ` +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## برای ای پی آی کامپوننت خود مستند بنویسید + +A Vue.js component instance is created by using the component element inside your application. The instance is configured through its custom attributes. For the component to be used by other developers, these custom attributes - the component's API - should be documented in a `README.md` file. + +### چرا؟ + +- Documentation provides developers with a high level overview to a component, without the need to go through all its code. This makes a component more accessible and easier to use. +- A component's API is the set of custom attributes through which its configured. Therefore these are especially of interest to other developers which only want to consume (and not develop) the component. +- Documentation formalises the API and tells developers which functionality to keep backwards compatible when modifying the component's code. +- `README.md` is the de facto standard filename for documentation to be read first. Code repository hosting services (Github, Bitbucket, Gitlab etc) display the contents of the the README's, directly when browsing through source directories. This applies to our module directories as well. + +### با چه روشی؟ + +Add a `README.md` file to the component's module directory: + +``` +range-slider/ +├── range-slider.vue +├── range-slider.less +└── README.md +``` + +Within the README file, describe the functionality and the usage of the module. For a vue component its most useful to describe the custom attributes it supports as those are its API: + +# Range slider + +## قابلیت + +The range slider lets the user to set a numeric range by dragging a handle on a slider rail for both the start and end value. + +This module uses the [noUiSlider](http://refreshless.com/nouislider/) for cross browser and touch support. + +## نحوه استفاده + +`` supports the following custom component attributes: + +| attribute | type | description | +| ---------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `min` | Number | number where range starts (lower limit). | +| `max` | Number | Number where range ends (upper limit). | +| `values` | Number[] _اختیاری_ | Array containing start and end value. E.g. `values="[10, 20]"`. Defaults to `[opts.min, opts.max]`. | +| `step` | Number _اختیاری_ | Number to increment / decrement values by. Defaults to 1. | +| `on-slide` | Function _اختیاری_ | Function called with `(values, HANDLE)` while a user drags the start (`HANDLE == 0`) or end (`HANDLE == 1`) handle. E.g. `on-slide={ updateInputs }`, with `component.updateInputs = (values, HANDLE) => { const value = values[HANDLE]; }`. | +| `on-end` | Function _اختیاری_ | Function called with `(values, HANDLE)` when user stops dragging a handle. | + +For customising the slider appearance see the [Styling section in the noUiSlider docs](http://refreshless.com/nouislider/more/#section-styling). + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## دمو کامپوننت را اضافه کنید + +Add a `index.html` file with demos of the component with different configurations, showing how the component can be used. + +### چرا؟ + +- A component demo proves the component works in isolation. +- A component demo gives developers a preview before having to dig into the documentation or code. +- Demos can illustrate all the possible configurations and variations a component can be used in. + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +## فایل های کامپوننت خود را لینت کنید + +Linters improve code consistency and help trace syntax errors. .vue files can be linted adding the `eslint-plugin-html` in your project. If you choose, you can start a project with ESLint enabled by default using `vue-cli`; + +### چرا؟ + +- لینت کردن فایل های کامپوننت این اطمینان را می دهد همه توسعه دهندگان از یک استایل کدی مشابه استفاده کنند +- لینت کردن فایل ها کمک می کند که ارور های سینتکسی را قبل از اینکه به مشکل بخورید پیدا کنید + +### با چه روشی؟ + +To allow linters to extract the scripts from your `*.vue` files, put script inside a ` +``` + +[↑ برگشت به فهرست مطالب](#فهرست-مطالب) + +--- + +## می خواهید کمک کنید? + +فورک کنید و برای چیزی که فکر می کنید بهتر است بیان شود پول ریکوئست دهید یا یک [Issue](https://github.com/pablohpsilva/vuejs-component-style-guide/issues/new) بسازید. + + + +## مترجم ها + +- [پرتغالی برزیلی](README-PTBR.md): Pablo Henrique Silva [github:pablohpsilva](https://github.com/pablohpsilva), [twitter: @PabloHPSilva](https://twitter.com/PabloHPSilva) +- [روسی](https://pablohpsilva.github.io/vuejs-component-style-guide/#/russian): Mikhail Kuznetcov [github:shershen08](https://github.com/shershen08), [twitter: @legkoletat](https://twitter.com/legkoletat) +- [فارسی](README-FA.md): Alireza Arabshahi [github:AlirezaArabshahi](https://github.com/AlirezaArabshahi), [twitter: @iialireza7](https://twitter.com/iialireza7) diff --git a/README-JP.md b/README-JP.md new file mode 100644 index 0000000..49e1972 --- /dev/null +++ b/README-JP.md @@ -0,0 +1,689 @@ +# Vue.js コンポーネント スタイル ガイド + +

+ +

+ +### 翻訳 +* [英語](https://pablohpsilva.github.io/vuejs-component-style-guide/#/) +* [ブラジルポルトガル語](https://pablohpsilva.github.io/vuejs-component-style-guide/#/portuguese) +* [中国語](https://pablohpsilva.github.io/vuejs-component-style-guide/#/chinese) +* [韓国語](https://pablohpsilva.github.io/vuejs-component-style-guide/#/korean) +* [ロシア語](https://pablohpsilva.github.io/vuejs-component-style-guide/#/russian) + +## 目的 + +このガイドはあなたの[Vue.js](http://vuejs.org/) のコードを統一する方法を提供します。 + +* 開発者/チームメンバがより問題を理解し、見つけやすくする。 +* IDEがよりコードを解釈し、支援を提供しやすくする。 +* すでに使用しているビルドツールを(再)利用しやすくする。 +* 別々のコードの塊を蓄え、供給しやすくする。 + +このガイドは[De Voorhoede](https://github.com/voorhoede)による[RiotJS Style Guide](https://github.com/voorhoede/riotjs-style-guide)に刺激を受け作られました。 + +## 目次 + +* [モジュールベースの開発](#モジュールベースの開発) +* [Vueコンポーネントの名前](#vueコンポーネントの名前) + +* [コンポーネントの記述をシンプルに保つ](#コンポーネントの記述をシンプルに保つ) +* [コンポーネントのpropsをプリミティブに保つ](#コンポーネントのpropsをプリミティブに保つ) +* [コンポーネントのpropsの利用](#コンポーネントのpropsの利用) +* [`this`を`component`に割り当てる](#thisをcomponentに割り当てる) +* [コンポーネント構成](#コンポーネント構成) +* [コンポーネントイベント名](#コンポーネントイベント名) +* [`this.$parent`を避ける](#thisparentを避ける) +* [`this.$refs`は注意して使用する](#thisrefsは注意して使用する) +* [スタイルスコープとしてコンポーネント名を使用する](#スタイルスコープとしてコンポーネント名を使用する) +* [コンポーネントAPIをドキュメント化する](#コンポーネントapiをドキュメント化する) +* [コンポーネントデモの追加](#コンポーネントデモの追加) +* [コンポーネントファイルをLintする](#コンポーネントファイルをlintする) +* [必要に応じてコンポーネントを作成する](#必要に応じてコンポーネントを作成する) + + + +## モジュールベースの開発 + +常に単一の機能を持つ小さなモジュールからアプリケーションを構築しましょう。 + +モジュールはアプリケーションの自己完結型の小さな部品です。特にVue.jsライブラリはあなたが*view-logicなモジュール*を作れるように設計されています。 + +### 理由 + +小さなモジュールにすることで、あなたと他の開発者両方にとって、学びやすく、理解しやすく、維持しやすく、再利用しやすく、そして、 +デバッグしやすくなります。 + +### 方法 + +各Vueコンポーネント(モジュールのようなもの)は [FIRST](https://addyosmani.com/first/): ひとつのことに集中し (*Focused* ([単一責任](http://en.wikipedia.org/wiki/Single_responsibility_principle)))、独立していて(*Independent*)、 再利用可能で(*Reusable*)、小さく(*Small*) そしてテスト可能 (*Testable*)でなければなりません。 + +もしあなたのコンポーネントが多くのことをしていて大きすぎる場合、ひとつのことだけをする、より小さなコンポーネントに分けましょう。 +経験則から言うと、各コンポーネントは100行以下のコードになるようにするのがいいでしょう。また、例えばスタンドアローンのデモを追加することによって、 +Vueコンポーネントが独立して動作することを確認しましょう。 + +[↑ 目次に戻る](#目次) + + +## Vueコンポーネントの名前 + +各コンポーネントの名前は、 + +* **意味のある名前で**: 具体的過ぎず、抽象的過ぎず。 +* **短く**: 2または3語。 +* **発音可能**: それらについて話せるようにしたい。 + +であるべきです。 + +さらにVueコンポーネントの名前は、 + +* **カスタム要素仕様に準拠**: [ハイフンを含み](https://www.w3.org/TR/custom-elements/#concepts)、 予約語は使用しない。 +* **`app-` ネームスペース**: 非常に汎用的、あるいは1語であれば、他のプロジェクトでも容易に再利用できる。 + +であるべきです。 + +### 理由 + +* 名前は、コンポーネントについて会話するときに使用されます。したがって、それは短く、意味があり、発音可能でなければなりません。 + +### 方法 + +```html + + + + + + + + + +``` + +[↑ 目次に戻る](#目次) + + +## コンポーネントの記述をシンプルに保つ + +Vue.jsのインラインの記述は100%JavaScriptです。これは非常に強力なことですが、複雑になる可能性もあるということです。 +ですので、**シンプルな記述を保つようにしましょう。**. + +### 理由 + +* 複雑なインラインの記述は判読困難です。 +* インラインの記述は他の場所で再利用できません。これはコードの重複と腐敗につながります。 +* IDEは基本的に式の構文サポート機能を持っていないため、自動補完や検証を行うことができません。 + +### 方法 + +もしあまりにも複雑だったり、判読困難な場合は**メソッド、またはcomputedプロパティに移動させましょう**! + +```html + + + + + + +``` + +[↑ 目次に戻る](#目次) + + +## コンポーネントのpropsをプリミティブに保つ + +Vue.jsは複雑なJavaScriptオブジェクトを渡せるようになっていますが, **コンポーネントのpropsはできるだけプリミティブに保つ** ようにするべきです。複雑なオブジェクトの使用を避け、[JavaScriptプリミティブ](https://developer.mozilla.org/en-US/docs/Glossary/Primitive)と関数のみを使うようにしましょう。 + +### 理由 + +* 各propの属性を別々に使用することにより、コンポーネントは明確で表現力豊かなAPIを持つことになります。 +* propsの値としてプリミティブとファンクションのみを使用することで、コンポーネントのAPIをネイティブHTML(5)のAPIに似たものにできます。 +* 各propの属性を使用することで、他の開発者がコンポーネントインスタンスに何が渡されるかを理解しやすくなります。 +* 複雑なオブジェクトが渡されると、そのオブジェクトのどのプロパティとメソッドが実際にカスタムコンポーネントで使われるかがわかりにくくなります。これによりコードのリファクタリングが難しくなり、腐敗を招くことになります。 + +### 方法 + +プリミティブまたは関数を値としたpropsごとのコンポーネント属性を使用します。 + +```html + + + + + + +``` + +[↑ 目次に戻る](#目次) + + +## コンポーネントのpropsの利用 + +Vue.jsでは、あなたのコンポーネントのpropsはあなたのAPIです。頑丈で予測しやすいAPIは、他の開発者があなたのコンポーネントを使用するのを簡単にします。 + +コンポーネントのpropsはカスタムHTML属性を介して渡されます。 これらの属性の値はVue.jsプレーンストリング (`:attr="値"` または `v-bind:attr="値"`)か、または無いこともあります。 あなたは **コンポーネントのpropsを利用** して、それらの異なるケースに対応できるようにしましょう。 + +### 理由 + +コンポーネントのpropsを利用することで、あなたのコンポーネントを常に機能するようになります(防御的プログラミング)。それは後で他の開発者が、あなたが想定していない方法でコンポーネントを使用する場合でもです。 + +### 方法 + +* propsのデフォルト値を使用します。 +* 期待するタイプの値の[検証](http://vuejs.org/v2/guide/components.html#Prop-Validation)のために、`type`オプションを使用します。**[1\*]** +* 使用される前にpropsが存在するかチェックします。 + +```html + + +``` + +[↑ 目次に戻る](#目次) + + +## `this`を`component`に割り当てる + +Vue.jsコンポーネントのコンテキスト内では、 `this`はコンポーネントインスタンスにバインドされています。 +したがって、別のコンテキストで参照する必要がある場合は、 `this` が`component`として使用できることを確認してください。 + +言い換えれば: `const self = this;`のようなコーディングはもう **しないで** ください。 Vueコンポーネントの使用は安全です。 + +### 理由 + +* ES6を使っている場合、`this`を変数に保存しておく必要はありません。 +* 通常、アロー関数を使用すれば静的スコープは保持されます。 +* ES6を使用して**いない**ために、`アロー関数`を使用できない場合は、`this`を変数に格納する必要があります。それが唯一の例外です。 + +### 方法 + +```html + + + + +``` + +[↑ 目次に戻る](#目次) + + +## コンポーネント構成 + +論理的に考えやすく、思考の流れに従いやすいようにしましょう. 方法を見てください。 + +### 理由 + +* コンポーネントを明確かつグループ化されたオブジェクトとすることで、コードを読みやすくし、開発者はコードの基準を簡単に持てるようになります。 +* props、data、computed、watches、そしてmethodsをアルファベット順に並べることで、見つけやすくなります。 +* 繰り返しになりますが, コンポーネントをグループ化することで読みやすくなります (name、extends、props、dataそしてcomputed、components、 watch、methods、lifecycle methods、など); +* `name`属性を使いましょう. [vue devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en)とname属性を使うと、開発/テストが容易になります。 +* [BEM](https://medium.com/tldr-tech/bem-blocks-elements-and-modifiers-6b3b0af9e3ea#.bhnomd7gw)、または [rscss](https://github.com/rstacruz/rscss)のようなCSSの命名方法論を使いましょう。 - [詳細?](#スタイルスコープとしてコンポーネント名を使用する); +* Vue.jsの製作者Evan Youが推奨するように、テンプレートスクリプト形式の.vueファイル構成を使用しましょう。 + +### 方法 + +コンポーネンのト構成: + +```html + + + + + +``` + +[↑ 目次に戻る](#目次) + +## コンポーネントイベント名 + +Vue.jsはすべてのVueハンドラ関数を提供し、式はViewModelに厳密にバインドされています。各コンポーネントのイベントは、開発中の問題を回避するような良い名前付けのスタイルを適用しましょう。 以下の **理由** を参照してください。 + +### 理由 + +* 開発者は好きなイベント名を自由に使うことができるため、混乱を招く可能性があります。 +* イベントに名前をつける自由は、 [DOMテンプレートの非互換性](https://vuejs.org/v2/guide/components.html#DOM-Template-Parsing-Caveats)につながる可能性があります。 + +### 方法 + +* イベント名前はケバブケースにするべきです。 +* あなたのコンポーネントで外部で関心を持つ独自のアクションのため、upload-success、upload-error、さらにはdropzone-upload-success、 dropzone-upload-errorのような固有の名前をつける必要があります。(スコープ付きプレフィックスを使用する必要がある場合は) +* イベント名は末尾が不定形の動詞(例 client-api-load)、または名詞(例 drive-upload-success)で終わるべきです。([出典](https://github.com/GoogleWebComponents/style-guide#events)); + +[↑ 目次に戻る](#目次) + +## `this.$parent`を避ける + +Vue.jsは、親コンテキストにアクセスできるネストされたコンポーネントをサポートしています。 あなたのVueコンポーネントの外部のコンテキストにアクセスすることは、 [モジュールベースの開発](#module-based-development)の[FIRST](https://addyosmani.com/first/)のルールに違反するため、 ** `this.$parent`の使用を避ける ** べきです。 + +### 理由 + +* vueコンポーネントは、他のコンポーネントと同様に、独立して動作する必要があります。 コンポーネントがその親にアクセスする必要がある場合、このルールは壊されます。 +* コンポーネントがその親にアクセスする必要がある場合、別のコンテキストで再利用することはできません。 + +### 方法 + +* 属性/プロパティを使用して、親から子コンポーネントに値を渡します。 +* 属性の式のコールバックを使用して、親コンポーネントで定義されたメソッドを子コンポーネントに渡します。 +* 子コンポーネントからイベントを発行し、それを親コンポーネントでキャッチします。 + +[↑ 目次に戻る](#目次) + +## `this.$refs`は注意して使用する + +Vue.jsは`ref`属性を介して他のコンポーネントや、基本的なHTML要素のコンテキストにアクセスできるコンポーネントをサポートしています。この属性は`this.$refs`を介して、コンポーネントまたDOM要素のコンテキストにアクセス可能な方法を提供します。ほとんどの場合、 `this.$refs`を介して **他のコンポーネント** のコンテキストにアクセスする必要性は避けることができます。このため、間違ったコンポーネントAPIを避けるためにこれを使用するときは注意が必要です。 + +### 理由 + +* vueコンポーネントは、他のコンポーネントと同様に、**独立して動作する必要があります**。 コンポーネントが必要なすべてのアクセスをサポートしていない場合、それは悪い設計/実装です。 +* ほとんどのコンポーネントでは、プロパティとイベントで十分です。 + +### 方法 + +* 良いコンポーネントAPIを作りましょう。 +* 独創的なコンポーネントの目的に常に注意してください。 +* 特殊なコードを書かないでください。ジェネリックコンポーネント内に特殊なコードを記述する必要がある場合は、APIが十分に一般的でないか、他のケースを管理するために新しいコンポーネントが必要になるということです。 +* すべてのpropsをチェックして、欠けているものがあるかどうか確認します。 もしあれば、課題を作成するかあなたのコンポーネントを強化しましょう。 +* すべてのイベントをチェックしましょう。ほとんどのケースで、開発者は子-親のコミュニケーション(イベント)が必要であることを忘れてしまいます。 そのため、(propsを使用した)親-子のコミュニケーションだけを覚えているのです。 +* **Propsは下へ、eventsは上へ!** ゴールとして良いAPIと分離を要求された場合、コンポーネントをアップグレードしましょう。 +* propsやeventsが消耗し、コンポーネントでの`this.$refs`の利用が利にかなっているときは、それを使用するべきです。 (下の例を参照してください). +* データバインディングやディレクティブで要素を操作できない場合、 (`jQuery`, `document.getElement*`, `document.queryElement`の代わりに) `this.$refs`を使用してDOM要素にアクセスすることは良い方法です。 + +```html + + +``` + +```html + + +

Basic Modal

+ +
+ + + + + + + +``` + +```html + + + + +``` + +[↑ 目次に戻る](#目次) + + +## スタイルスコープとしてコンポーネント名を使用する + +Vue.jsのコンポーネント要素は、スタイルスコープのルートとして非常によく使用されるカスタム要素です。 +あるいは、コンポーネント名はCSSクラスネームスペースとして、使用できます。 + +### 理由 + +* コンポーネント要素のスタイルをスコープすると、コンポーネントの外にスタイルが漏れるのを防ぐため、予測可能性が向上します。 + +* モジュールディレクトリに同じ名前を使用すると、Vue.jsコンポーネントとスタイルルートが同じところに属していることを開発者が理解しやすくなります。 + +### 方法 + +BEMとOOCSSに基づくネームスペースプレフィックスとしてコンポーネント名を使いましょう。 **そして** スタイルクラスで`scoped`属性を使いましょう。 +`scoped`を使用すると、` +``` + +[↑ 目次に戻る](#目次) + + +## コンポーネントAPIをドキュメント化する + +Vue.jsコンポーネントのインスタンスは、アプリケーション内のコンポーネント要素を使用して作成されます。インスタンスはそのカスタム属性によって構成されます。他の開発者がコンポーネントを使用するときのため、これらのカスタム属性(コンポーネントのAPI)を`README.md`ファイルに記述しましょう。 + +### 理由 + +* ドキュメンテーションは、開発者に、そのコードのすべてを伝えることなく、コンポーネントの概要を高レベルで表示します。これにより、コンポーネントのアクセスが容易になり、使いやすくなります。 +* コンポーネントのAPIは、それを構成するカスタム属性のセットです。したがって、これらは、コンポーネントを使用する(開発しない)開発者にとって特に重要です。 +* ドキュメンテーションはAPIを形式化し、コンポーネントのコードを変更するときに下位互換性を維持する機能を開発者に教えます。 +* `README.md`は最初に読み込まれるドキュメントのデファクトスタンダードファイル名です。 コードリポジトリホスティングサービス(Github、Bitbucket、Gitlabなど)は、ソースディレクトリを参照するときに、READMEファイルの内容を直接表示します。これは私たちのモジュールディレクトリにも当てはまります。 + +### 方法 + +コンポーネントのモジュールディレクトリに`README.md`ファイルを追加しましょう。 + +``` +range-slider/ +├── range-slider.vue +├── range-slider.less +└── README.md +``` + +READMEファイルに、モジュールの機能と使用方法を記述しましょう。 vueコンポーネントの場合、APIとしてサポートされているカスタム属性を記述するのが最も役立ちます。 + + +# Range slider + +## 機能 + +range sliderは、スライダーレールのハンドルを開始値と終了値の両方でドラッグして数値範囲を設定できます。 + +このモジュールはクロスブラウザとタッチサポートのため、noUiSliderを使用します。 + +## 使用方法 + +`` 次のカスタムコンポーネント属性をサポートしています: + +| 属性 | 型 | 説明 +| --- | --- | --- +| `min` | 数値 | レンジの始まりの数値 (下限)。 +| `max` | 数値 | レンジの終わりの数値 (上限). +| `values` | 数値[] *任意* | 開始値と終了値を含む配列。 例. `values="[10, 20]"`. デフォルトは`[opts.min, opts.max]`. +| `step` | 数値 *任意* | インクリメント/デクリメントの数値。デフォルトは1。 +| `on-slide` | 関数 *任意* | ユーザーが開始(`HANDLE == 0`)または終了(`HANDLE == 1`)ハンドルをドラッグしているときに、`(values, HANDLE)`で呼び出される関数。例. `on-slide={ updateInputs }` `component.updateInputs = (values, HANDLE) => { const value = values[HANDLE]; }`. +| `on-end` | 関数 *任意* | ユーザーがハンドルのドラッグを停止したとき、`(values, HANDLE)`で呼び出される関数。 + +スライダの外観をカスタマイズするには[noUiSliderドキュメントのStylingセクション](http://refreshless.com/nouislider/more/#section-styling)を参照してください。 + + +[↑ 目次に戻る](#目次) + + +## コンポーネントデモの追加 + +構成の異なるコンポーネントのデモを含むindex.htmlファイルを追加し、コンポーネントの使用方法を示しましょう。 + +### 理由 + +* コンポーネントのデモは、コンポーネントが単独で動作することを示します。 +* コンポーネントのデモは、ドキュメンテーションやコードを掘り起こす前に、開発者にプレビューを提供します。 +* デモでは、コンポーネントを使用できるすべての可能な構成とバリエーションを示すことができます。 + +[↑ 目次に戻る](#目次) + + +## コンポーネントファイルをLintする + +Lintersはコードの一貫性を高め、構文エラーの追跡に役立ちます。.vueファイルはプロジェクトに`eslint-plugin-html`を追加してlintすることができます。vue-cliを使用すれば、ESLintをデフォルトで有効にしてプロジェクトを開始できます。 + +### 理由 + +* コンポーネントファイルのLintは、すべての開発者が同じコードスタイルを使用するようにします。 +* コンポーネントファイルのLintは、遅くなる前に構文エラーの追跡をするのに役立ちます。 + +### 方法 + +lintersがあなたの`*.vue`ファイルからスクリプトを抽出するためには, [スクリプトを` ``` @@ -555,7 +561,7 @@ Linters improve code consistency and help trace syntax errors. .vue files can be ### How? -To allow linters to extract the scripts from your `*.vue` files, [put script inside a ` +``` + +[↑ back to Table of Contents](#table-of-contents) + --- ## Wanna help? diff --git a/docs/index.html b/docs/index.html index a372db1..be0b2d3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -26,6 +26,7 @@ {title: 'English', path: '/'}, {title: 'Português do Brasil', path: '/portuguese', source: 'https://raw.githubusercontent.com/pablohpsilva/vuejs-component-style-guide/master/README-PTBR.md'}, {title: '中文', path: '/chinese', source: 'https://raw.githubusercontent.com/pablohpsilva/vuejs-component-style-guide/master/README-CN.md'}, + {title: '日本語', path: '/japanese', source: 'https://raw.githubusercontent.com/pablohpsilva/vuejs-component-style-guide/master/README-JP.md'}, {title: '한국어', path: '/korean', source: 'https://raw.githubusercontent.com/pablohpsilva/vuejs-component-style-guide/master/README-KR.md'}, {title: 'русский язык', path: '/russian', source: 'https://raw.githubusercontent.com/pablohpsilva/vuejs-component-style-guide/master/README-RU.md'} ]}