diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 2f383ab2..531e6fe9 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -70,13 +70,23 @@ module.exports = { }, }, '/ru/': { - selectText: 'Languages', + selectText: 'Языки', label: 'Русский', - editLinkText: 'Edit this page on GitHub', + editLinkText: 'Редактировать эту страницу на GitHub', + nav: [ + { + text: 'Руководство', + link: '/ru/guide/' + }, + { + text: 'API', + link: '/ru/api/' + } + ], serviceWorker: { updatePopup: { - message: "New content is available.", - buttonText: "Refresh" + message: "Доступен новый контент.", + buttonText: "Обновить" } }, }, @@ -132,7 +142,7 @@ module.exports = { '/ru/': { lang: 'ru', title: '📈 vue-chartjs', - description: '⚡ Easy and beautiful charts with Chart.js and Vue.js' + description: '⚡ Простые и красивые графики с Chart.js и Vue.js' }, '/pt-br/': { lang: 'pt-br', diff --git a/docs/ru/README.md b/docs/ru/README.md index 877e567f..8d137fc0 100644 --- a/docs/ru/README.md +++ b/docs/ru/README.md @@ -1,14 +1,14 @@ --- home: true heroImage: /vue-chartjs.png -actionText: Get Started → -actionLink: /guide/ +actionText: Начать → +actionLink: /ru/guide/ features: -- title: Easy - details: Easy for both beginners and pros 🙌 -- title: Extendable - details: Simple to use, easy to extend 💪 -- title: Powerful - details: With the full power of chart.js 💯 +- title: Простота + details: Просто как для новичков, так и для профессионалов 🙌 +- title: Расширяемость + details: Просто использовать, легко расширять 💪 +- title: Могущество + details: С полной силой chart.js 💯 footer: MIT Licensed | Copyright © 2018-present Jakub Juszczak --- diff --git a/docs/ru/api/README.md b/docs/ru/api/README.md index e69de29b..8ab08eef 100644 --- a/docs/ru/api/README.md +++ b/docs/ru/api/README.md @@ -0,0 +1,127 @@ +# Справочник + +## Свойства + +Существуют базовые свойства, определённые в компонентах, предоставленных `vue-chartjs`. Так как вы `extend`ите их, они *невидимы*, но вы можете переопределить их: + +| Свойство | Описание | +|---|---| +| width | ширина графика | +| height | высота графика | +| chart-id | id canvas-элемента | +| css-classes | String с классами CSS для родительского элемента div | +| styles | Object со стилями CSS для родительского элемента div | +| plugins | Array с плагинами chartjs | + +## События + +Если миксин `reactiveData` или `reactiveProp` привязан, будут вызываться следующие события: + +| Событие | Описание | +|---|---| +| `chart:render` | если миксин осуществляет полную перерисовку графика | +| `chart:destroy` | если миксин удаляет экземпляр объекта графика | +| `chart:update` | если миксин осуществеляет обновление графика вместо полной перерисовки | +| `labels:update` | если установлены новые метки | +| `xlabels:update` | если установлены новые метки по оси x | +| `ylabels:update` | если установлены новые метки по оси y | + + +## Глобальные методы +Глобальные методы, которые должны быть импортированы + +### generateChart() + +- **Тип:** `Function` +- **Аргументы:**: `chart-id`, `chart-type` +- **Использование:** + +```js +import { generateChart } from 'vue-chartjs' +// First argument is the chart-id, second the chart type. +const CustomLine = generateChart('custom-line', 'LineWithLine') +``` + +## Методы экземпляра + +Методы экземпляра могут быть использованы внутри вашего графика-компонента + +### generateLegend() + +Вспомогательная функция для генерации HTML-легенды + +- **Тип:** `Function` +- **Использование:** + +```js {11} +import { Line } from 'vue-chartjs' + +export default { + extends: Line, + props: ['datasets', 'options'] + data: () => ({ + htmlLegend: null + }) + mounted () { + this.renderChart(this.datasets, this.options) + this.htmlLegend = this.generateLegend() + } +} + +``` + +### addPlugin() + +В Chart.js вы можете определить глобальные и встроенные плагины. Глобальные плагины без проблем работают с `vue-chartjs` как описано в [документации к Chart.js](http://www.chartjs.org/docs/latest/developers/plugins.html). + +Если вы хотите добавить встроенные плагины, `vue-chartjs` предоставляет вспомогательный метод `addPlugin()` +Вам надо вызвать `addPlugin()` перед вызовом метода `renderChart()`. + +- **Тип:** `Function` +- **Аргументы:**: `Array` плагинов +- **Использование:** + +```js +mounted () { + this.addPlugin({ + id: 'my-plugin', + beforeInit: function (chart) { + .... + } + }) +} +``` + +### renderChart() + +Создаёт экземпляр Chart.js и отрисовывает график. + +- **Тип:** `Function` +- **Аргументы:**: `Chart Data`, `Chart Options` +- **Использование:** + +```js +mounted () { + this.renderChart({ + labels: ['Январь', 'Февраль'], + datasets: [ + { + label: 'Какие-то данные', + backgroundColor: '#f87979', + data: [40, 20] + } + ]}, + { + responsive: true + } + ) +} +``` + +## Объект Chart.js + +Вы можете получить доступ к объекту Chart.js из вашего графика-компонента посредством `this.$data._chart` + +## Canvas-элемент + +Вы можете получить доступ к canvas-элементу посредством `this.$refs.canvas` diff --git a/docs/ru/guide/README.md b/docs/ru/guide/README.md index e69de29b..51d9530c 100644 --- a/docs/ru/guide/README.md +++ b/docs/ru/guide/README.md @@ -0,0 +1,503 @@ +# Для начинающих + +**vue-chartjs** - это обёртка для [Chart.js](https://github.com/chartjs/Chart.js) на Vue. Вы можете леко создать переиспользуемые компоненты-графики. + +## Вступление + +`vue-chartjs` позволяет вам использовать Chart.js без излишнего шаманства с Vue. Идеально для людей, которые просто хотят получить работающие графики как можно быстрее. + +Бизнес-логика абстрагируется, зато предоставляется доступ к объектам Chart.js для получения максимальной гибкости. + +## Установка + +### NPM + +Вы можете установить `vue-chartjs` посредством `npm`. Однако, вам также нужно добавить `chart.js` как зависимость для вашего проекта. Потому, что `Chart.js` - это peerDependency. Таким образом вы получите полный контроль над версионированием Chart.js. + +Установка посредством **npm**: `npm install vue-chartjs chart.js --save` + +::: tip +Если вы используете vue 1.x пожалуйста, используйте тег `legacy`. Однако, помните, что Vue версии 1 больше не поддерживается. + +`yarn add vue-chartjs@legacy` +::: + + +### YARN + +Установка посредством **yarn**: `yarn add vue-chartjs chart.js` + +### Браузер + +Вы также можете использовать `vue-chartjs` прямо в браузере. +Для этого сначала добавьте скрипт Vue, если он ещё не загружен, потом - скрипт `Chart.js`, а после него - минимизированную версию скрипта `vue-chartjs`. +```html + + + +``` + +Дальше вы можете просто зарегистрировать свой компонент: + +```js +Vue.component('line-chart', { + extends: VueChartJs.Line, + mounted () { + this.renderChart({ + labels: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], + datasets: [ + { + label: 'Коммиты на GitHub', + backgroundColor: '#f87979', + data: [40, 20, 12, 39, 10, 40, 39, 80, 40, 20, 12, 11] + } + ] + }, {responsive: true, maintainAspectRatio: false}) + } +}) +``` + +[Пример на Сodepen](https://codepen.io/apertureless/pen/zEvvWM). + +## Интеграция + +Каждый тип графика, доступный в `Chart.js`, экспортируется как именованый компонент и может быть импортирован как таковой. Эти компоненты - нормальные Vue-компоненты, однако вам необходимо расширять их. + +Идея, стоящая за `vue-chart.js`, состоит в том, чтобы предоставить простые в использовании компоненты, с максимумом гибкости и расширяемости. Для достижения этого, вам нужно создать ваш собственный график-компонент и расширить его предоставленными `vue-chart.js` компонентами. + +Таким образом, методы и логика графиков-компонентов включается в ваш график-компонент. + + +## Создание вашего первого графика + +Вам необходимо импортировать базовый компонент, а затем расширить его. Это даёт больше гибкости при работе с различными данными. Однако, ваш компонент не может быть переиспользован таким образом. + +Вы можете импортировать весь пакет или каждый модуль отдельно. Потом вам нужно использовать `extends:` или `mixins:[]`. Далее, в хуке `mounted()`, вызовите `this.renderChart()`. Это создаст экземпляр вашего объекта. + +```javascript {1,4,6} +import { Bar } from 'vue-chartjs' + +export default { + extends: Bar, + mounted () { + this.renderChart(data, options) + } +} +``` + +:::tip +Вы можете использовать или `extends: Bar` или `mixins: [Bar]` +::: + +Метод `this.renderChart()` предоставляется компонентом `Bar` и принимает два параметра. Об являются `objects`. Первый используется для данных вашего графика, а второй - как объект опций. + +Со структурой этих объектов можете ознакомиться в [официальной документации Chart.js](http://www.chartjs.org/docs/latest/#creating-a-chart) + +## Однофайловые компоненты Vue + +Большинство примеров в документации базируется на javascript-файлах, а не на `.vue` файлах. Причиной этому является то, что в большинстве случаев вам понадобится только блок ` + + +``` + +::: danger Template-теги не объединяются +**Не** включайте тег `` в ваши `.vue` файлы компонентов. Vue **не** может объединять шаблоны. И шаблон включается в миксин. Если вы добавите пустой тег шаблона в вашем компоненте, он перезапишет тот, который приходит из базового графика, и вы получите пустой экран. +::: + +## Обновление графиков + +Chart.js не обновляет и не перерисовывает график если новые данные были переданы. +Однако, вы можете просто реализовать это сами или использовать один из двух уже реализованных миксинов: + +- `reactiveProp` +- `reactiveData` + +Оба включены в модуль `mixins` и оба преследуют одну цель. В большинстве случаев вы будете использовать `reactiveProp`. Этот миксин расширяет логику вашего графика-компонента и автоматически создаёт свойства `chartData` и автоматически добавляет `vue watch` на это свойство. При изменении данных, он или вызовет `update()`, если изменились только данные внутри уже существующих `datasets`, или `renderChart()`, если были добавлены новые наборы данных. + +`reactiveData` просто создаёт локальную переменную `chartData` (которая не является свойством!) и добавляет watcher. Это полезно только в том случае, если вам необходимы одноцелевые графики и вы совершаете API-вызовы внутри ваших графиков-компонентов. + +### Пример + +**LineChart.js** +```javascript +import { Line, mixins } from 'vue-chartjs' +const { reactiveProp } = mixins + +export default { + extends: Line, + mixins: [reactiveProp], + props: ['options'], + mounted () { + // this.chartData создаётся внутри миксина. + // Если вы хотите передать опции, создайте локальный объект options + this.renderChart(this.chartData, this.options) + } +} +``` + +**RandomChart.vue** + +```javascript + + + + + +``` + +::: danger Ограничения Vue по мутации массивов и объектов + +[Caveats](https://vuejs.org/v2/guide/list.html#Caveats) +[Change-Detection-Caveats](https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats) +[vm.$watch](https://vuejs.org/v2/api/#vm-watch) + +::: + + +### События + +Реактивные миксины вызывают события при изменении данных. Вы можете прослушивать их при помощи `v:on` на графике-компоненте. Доступны следующие события: + +- `chart:render` - если миксин выполняет полную перерисовку графика +- `chart:destroy` - если миксин удаляет объект графика +- `chart:update` - если миксин совершает обновление вместо полной перерисовки +- `labels:update` - если были установлены новые метки +- `xlabels:update` - если новые метки были установлены по оси x +- `ylabels:update` - если новые метки были установлены по оси y + + +### Отлов ошибок + +Система реактивности в её текущем состоянии **незрелая**. Вы столкнётесь с некоторыми проблемами с ней, так как существует множество путей использования и путей передачи ваших данных. + +#### Опции + +Объект `options` на данный момент не является реактивным. Если вы хотите динамически измените опции графика, это не будет распозно миксином. + +Если вы используете миксин, вам нужно передать опции как свойство `options`. Это важно, так как миксин вызовет метод `update()` из chart.js или уничтожит старый и отрисует новый график. Если миксин отрисовывает новый график, он вызывает `this.renderChart(this.chartData, this.options)`. + +Но если вы передаёте опции напрямую в вашем хуке `mounted()`, они теряются. + +::: danger Неправильно +```js {7} +import { Line, mixins } from 'vue-chartjs' + +export default { + components: { Line } + mixins: [mixins.reactiveProp], + mounted () { + this.renderChart(this.chartData, {responsive: true}) + } +} +``` +::: + +::: tip Правильно +```js {7} +import { Line, mixins } from 'vue-chartjs' + +export default { + components: { Line } + mixins: [mixins.reactiveProp], + mounted () { + this.renderChart(this.chartData, this.options) + } +} +``` + +::: + +#### Собственный watcher + +Если вы часто преобразуете или изменяете данные (вместо передачи новых данных), вам лучше реализовать свой собственный watcher. +Вы можете самостоятельно вызвать `this.$data._chart.update()` или `this.renderChart()`, в зависимости от ваших потребностей. + +Простой watcher выглядит так: + +```js +watch: { + chartData () { + this.$data._chart.update() + } +} +``` + +## Примеры + +### Графики со свойствами + +Вашей целью должно быть создание переиспользуемых компонентов-графиков. Для этой цели, вам необходимо использовать свойства Vue.js для передачи опций и данных для графика. Таким образом, график сам по себе не занимается стягиванием данных, а только их отображением. + +В первую очередь, создайте свой компонент: + +```js +import { Line } from 'vue-chartjs' + +export default { + extends: Line, + props: { + chartdata: { + type: Object, + default: null + }, + options: { + type: Object, + default: null + } + }, + mounted () { + this.renderChart(this.chartdata, this.options) + } +} +``` + +После этого добавьте свой график-компонент в родительский компонент: + +```js + +``` + +### График с локальными данными + +Вы можете передать данные напрямую в ваш график-компонент. Для этого просто передайте его в метод `renderChart()`: + +```js +import { Bar } from 'vue-chartjs' + +export default { + extends: Bar, + data: () => ({ + chartdata: { + labels: ['Январь', 'Февраль'], + datasets: [ + { + label: 'Данные 1', + backgroundColor: '#f87979', + data: [40, 20] + } + ] + }, + options: { + responsive: true, + maintainAspectRatio: false + } + }), + + mounted () { + this.renderChart(this.chartdata, this.options) + } +} +``` + +### График с данными с API + +Популярной моделью использования является запрос данных с API. Однако, необходимо кое-что запомнить. Самой частой проблемой является то, что вы встраиваете график-компонент напрямую и передаёте ему данные из асинхронного API-вызова. Проблема с этим подходом состоит в том, что график отрисовывается ранее, чем приходят данные из асинхронного API-вызова. + +Лучшее решение для предупреждения таких ситуаций - это использование `v-if`. + +Создавайте ваш график-компонент со свойствами данных и опций, чтобы вы могли передать их через компонент-контейнер: + +**Chart.vue** + +```js +import { Line } from 'vue-chartjs' + +export default { + extends: Line, + props: { + chartdata: { + type: Object, + default: null + }, + options: { + type: Object, + default: null + } + }, + mounted () { + this.renderChart(this.chartdata, this.options) + } +} +``` + +Далее создавайте компонент-контейнер, который занимается API-вызовами или vuex-соединением: + +**ChartContainer.vue** + +```html {4} + + + +``` + +### График с динамическими стилями + +Вы можете установить `responsive: true` и передать объект стилей, который будет применён как встроенный стиль для внешнего блока div. Таким образом вы можете динамически изменять высоту и ширину внешнего контейнера, что не является поведением по умолчанию для chart.js. Лучше всего использовать для этого вычисляемые параметры. + +::: warning + Вам необходимо установить `position: relative` +::: + +```html + + + +``` + +### Настраиваемые / новые графики + +Иногда вам нужно расширить обычные графики Chart.js. Существует множество [примеров](http://www.chartjs.org/docs/latest/developers/charts.html), как расширить или модифицировать графики по умолчанию, или создать собственный тип графика. + +В `vue-chartjs`, вы можете сделать это практически таким же путём: + +```js +// 1. Импортируйте Chart.js, чтобы использовать глобальный объект Chart +import Chart from 'chart.js' +// 2. Импортируйте метод `generateChart()` для создания компонента vue +import { generateChart } from 'vue-chartjs' + +// 3. Расширьте один из графиков по умолчанию +// http://www.chartjs.org/docs/latest/developers/charts.html +Chart.defaults.LineWithLine = Chart.defaults.line; +Chart.controllers.LineWithLine = Chart.controllers.line.extend({ /* ваши расширения */}) + +// 4. Сгенерируйте компонент vue-chartjs +// Первый аргумент - это chart-id, второй - типа графика +const CustomLine = generateChart('custom-line', 'LineWithLine') + +// 5. Расширьте компонент CustomLine так же, как вы это делаете с обычными графиками vue-chartjs + +export default { + extends: CustomLine, + mounted () { + // .... + } +} +``` + +## Ресурсы + +Вас могут также заинтересовать руководства по использованию `vue-chartjs` на других ресурсах: + +- [Using vue-chartjs with WordPress](https://medium.com/@apertureless/wordpress-vue-and-chart-js-6b61493e289f) +- [Create stunning Charts with Vue and Chart.js](https://hackernoon.com/creating-stunning-charts-with-vue-js-and-chart-js-28af584adc0a) +- [Let’s Build a Web App with Vue, Chart.js and an API Part I](https://hackernoon.com/lets-build-a-web-app-with-vue-chart-js-and-an-api-544eb81c4b44) +- [Let’s Build a Web App with Vue, Chart.js and an API Part II](https://hackernoon.com/lets-build-a-web-app-with-vue-chart-js-and-an-api-part-ii-39781b1d5acf) +- [Build a realtime chart with VueJS and Pusher](https://blog.pusher.com/build-realtime-chart-with-vuejs-pusher/)