Основы Vue.js — шпаргалка

Привет, мир не стоит на месте и технологии развиваются, так происходит и c JS. Все помнят когда вышел Jquery какой бум он произвел в среде JS разработке, но технологии не стоят на месте и вот на смену пришел vue.js. С помощью данного фреймворка можно сделать достойный проект в котором будет ООП если вы его даже не знаете. В этой статье речь пойдет основах VUE и с течением моих знаний будет пополняться данная статья.

Установка и настройка

Скачать фреймворк можно на оф. сайта.  Я использую для подключения CDN:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Подключаем VUE.JS-->
   <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</body>
</html>

Для работы Vue нужно также указать блок, который вуе будет обрабатывать, а также свойство data.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">

    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app"//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
            }
        })
    </script>
</body>
</html>

Все установку и настройку мы закончили, можно переходить к использованию фреймворка.

 Методы

Тут будем указывать наши методы (те же самые функции).

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{name}}</p>
        <p>{{sayHello}}</p>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name:'Антон',
            },
            methods:{//methods зарезервировано
                sayHello(){
                    return `Привет, ${this.name}`;
                },
            }
        })
    </script>
</body>
</html>

Добавляем ссылку

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{name}}</p>
        <p>{{sayHello}}</p>
        <a :href="link">Яндекс</a>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name:'Антон',
                link: 'https://ya.ru'
            },
            methods:{
                sayHello(){
                    return `Привет, ${this.name}`;
                },
            }
        })
    </script>
</body>
</html>

Указываем двоеточие перед href, тем самым сообщаем, что link теперь свойство data, а не строка.

Для того чтобы взять любое значение из data для любого атрибута в верстке, нужно перед атрибутом поставить двоеточие.

Работа с кнопкой

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{name}}</p>
        <p>{{sayHello}}</p>
        <a :href="link">Яндекс</a>
        <button v-on:click="counter++">Increase</button>
        <p>{{counter}}</p>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name:'Антон',
                link: 'https://ya.ru',
                counter: 0
            },
            methods:{
                sayHello(){
                    return `Привет, ${this.name}`;
                },
            }
        })
    </script>
</body>
</html>

v-on — регистрация события. Вместо v-on можно использовать символ @.

В примере используется событие click. Есть также событие с названием submit, если использовать его, то страничка будет перезагружать после нажатия на кнопку, чтобы это избежать нужно добавить submit.prevent.  prevent — отменяет действие по дефолту, т.е. перезагрузку страници.

Функции

Также можно передавать функции из блока методов.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{name}}</p>
        <p>{{sayHello}}</p>
        <a :href="link">Яндекс</a>
        <button @click=Increase(3)>Increase</button>
        <p>{{counter}}</p>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name:'Антон',
                link: 'https://ya.ru',
                counter: 0
            },
            methods:{
                sayHello(){
                    return `Привет, ${this.name}`;
                },
                Increase(step){
                    this.counter+=step;
                }
            }
        })
    </script>
</body>
</html>

Event

Также можно передать событие с помощью $event.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{name}}</p>
        <p>{{sayHello}}</p>
        <a :href="link">Яндекс</a>
        <button @click=Increase(3, $event)>Increase</button>
        <p>{{counter}}</p>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name:'Антон',
                link: 'https://ya.ru',
                counter: 0
            },
            methods:{
                sayHello(){
                    return `Привет, ${this.name}`;
                },
                Increase(step,e){
                    this.counter+=step;
                    console.log(e);
                }
            }
        })
    </script>
</body>
</html>

Тернарные операторы

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{name}}</p>
        <p>{{sayHello}}</p>
        <a :href="link">Яндекс</a>
        <button @click=Increase(3, $event)>Increase</button>
        <p>{{counter}}</p>
        <p>{{ counter > 10 ? "больше 10" : "Меньше 10" }}</p> // Тернарный оператор
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name:'Антон',
                link: 'https://ya.ru',
                counter: 0
            },
            methods:{
                sayHello(){
                    return `Привет, ${this.name}`;
                },
                Increase(step,e){
                    this.counter+=step;
                    console.log(e);
                }
            }
        })
    </script>
</body>
</html>

If … else

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        
        <!-- IF ELSE -->
        <p v-if="show">Показать</p>
        <p v-else="show">Не показывать</p>
        <button @click='show = !show'>GO</button>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                show: false
            }
        })
    </script>
</body>
</html>

Mausemove

Mausemove — движение курсора мышки.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p @mausemove="getCorordinates()">Lorem, ipsum dolor. {{ x }} / {{ y }}
            <span @mausemove.stop> не пересчитывать координаты на этом элементе</span>
        </p>

    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                x: 0,
                y: 0
            }
            methods:{
                getCorordinates(){ //получать текущие координаты мышки
                    this.x = event.clientX;
                    this.y = event.clientX;
                }
            }
        })
    </script>
</body>
</html>

Если в теге указать собитие @mausemove.stop, то пересчет координат не будет учитываться, т.е. мы это событие выключаем в этом теге.

V-model

Этот метод связывает значение с объектом data. Т.е. допустим есть объект data со свойством name: «Anton» и есть инпут, мы указали в атрибутах v-model=»name» теперь в инпуте при рендеренге будет отображаться Anton. Если ввести что-то другое в инпуте, то и свойство name в объекте data поменяет свое значение с «Anton» на то что вы ввели.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p>{{ name }}</p>
       <input type="text" v-model="name">
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>
        const app = new Vue({
            el: "#app",//el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                name: "Anton"
            }
        })
    </script>
</body>
</html>

В выше приведеном примере изменения будут меняться в режиме онлайн, а можно сделать, так, чтобы изменения вступали всилу после того, как пропадет фокус с инпута. Для этого укажите v-modal.lazy=»name».

V-html

Вставляет в нутрь тега свойство объекта data. В качестве свойства может выступать что угодно, буть то целый готовый блок див или просто число.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <p v-html="htmlLink"></p>
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let app = new Vue({
            el: "#app", //el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                htmlLink: "<a href='https://ya.ru'>Яндекс</a>"
            }
        })
    </script>
</body>
</html>

V-for

Цикл for поможет обойти маасив и вывести найденое в верстке.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <title>Document</title>
</head>
<body>
    <!-- Тут указываем блок, с которым работает VUE -->
    <div id="app">
        <div v-for="item of product">
            <ul>
                <li>{{ item.title }}</li>
                <li>{{ item.price }} руб.</li>
                <li>{{ item.quantity }} шт.</li>
            </ul>
        </div>  
    </div>
    <!-- Подключаем VUE.JS-->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let app = new Vue({
            el: "#app", //el зарезервировано
            data:{//data зарезервировано
                // тут уже любые свойства
                product: [
                {
                        title: "Хлеб",
                        price: 35,
                        quantity: 1
                    },
                    {
                        title: "Масло",
                        price: 135,
                        quantity: 2
                    },
                    {
                        title: "Икра",
                        price: 3500,
                        quantity: 1
                    },
                ]
            }
        })
    </script>
</body>
</html>

Mounted

Это свойство которое запускаем в первую очередью. Т.е. тут можно размещать функции, которые нужно выполнить заранее.

Компоненты

Выше в примерах, все делалось в одном файле, что крайне удобно при разработке больших приложений. Теперь же мы будем делить код приложения на блоки. Создадим тестовое приложения. Погнали.

index.html

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- выводим компонент -->
        <mycomp></mycomp> 
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="comp.js"></script>
    <script src="main.js"></script>
</body>
</html>

main.js

const app = new Vue({
    el: '#app'
})

comp.js

//используем класс Vue и статический компонент, укажем два основных параметра
//название компонента и второе объект, в котором есть свойство template 
Vue.component('mycomp', {
    template: '<p>Привет из компонента</p>'
})

На выходе получим параграф с текстом «Привет из компонента».

В компоненте помимо свойства template, еще есть свойство data, указывается в виде метода. Из этого свойства можно обращаться к любому созданному вами свойству объекта data.

Vue.component('mycomp', {
    data() {
        return {
            name: 'Антон',
            age: 34  
        }        
    },
    template: `
                <div>
                    <p>Привет, {{ name }}. Твой возраст {{ age }}.</p>
                </div>
            `
})

Также можно выводить в основном компоненте другие компоненты, вложенные.

//используем класс Vue и статический компонент, укажем два основных параметра
//название компонента и второе объект, в котором есть свойство template 
Vue.component('mycomp', {
    data() {
        return {
            name: 'Антон',
            age: 34  
        }        
    },
    template: `
                <div>
                    <p>Привет, {{ name }}. Твой возраст {{ age }}.</p>
                    <inner-comp></inner-comp>
                </div>
            `
})

Vue.component('inner-comp', {
    data() {
        return {
            counter: 0
        }
    },
    template: `
                <div>
                    <button @click='increase'>Push</button>
                    <span>{{ counter }}</span>
                </div>
            `,
    methods: {
        increase() {
            this.counter++;
        }
    }
})

Т.е. был создан еще один компонент inner-comp, и вызывается он через основной компонент.

Вложенность может быть любая, ограничений нет.

Вы можете вызывать вложенные компоненты через основной компонент или через вложенные, или через вложенные-вложенные, ограничений нет.

В template допускается один корневой тег, т.е. делаем один див и туда пихаем всю остальную верстку. Несколько главных дивов быть не может.

Переброс данных из шаблона index.html в компонент comp.js

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- выводим компонент -->
        <mycomp>123</mycomp> 
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="comp.js"></script>
    <script src="main.js"></script>
</body>
</html>

Для того чтобы вывести 123 нужно в comp.js указать в tempate тег slot.

//используем класс Vue и статический компонент, укажем два основных параметра
//название компонента и второе объект, в котором есть свойство template 
Vue.component('mycomp', {
    data() {
        return {
            name: 'Антон',
            age: 34  
        }        
    },
    template: `
                <div>
                    <p>Привет, {{ name }}. Твой возраст {{ age }}.</p>
                    <slot></slot>
                </div>
            `
})

Передаем данные из main.js в index.html -> comp.js с помощью атрибутов

Добавим атрибуты в index.html

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- выводим компонент -->
        <mycomp :name="name" :age ="age" x="1" title="test"></mycomp>
        <mycomp :name="name2" :age ="age2"></mycomp>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="comp.js"></script>
    <script src="main.js"></script>
</body>
</html>

Если перед атрибутом стоит :, то это значит брать данные из main.js.

Vue.component('mycomp', {
    props:[name, name2, age, age2,x,title],
    data() {
        return {
            name: 'Антон1',
            age: 341  
        }        
    },
    template: `
                <div>
                    <p>Привет, {{ name }}. Твой возраст {{ age }}.</p>
                    <slot></slot>
                </div>
            `
})

В данном примере уже есть локальные переменные с name и age, но данные будут тянуться из main.js. Для того чтобы данные брались из локальных переменных, необходимо обращаться к ним через $data:

Vue.component('mycomp', {
    props:[name, name2, age, age2,x,title],
    data() {
        return {
            name: 'Антон',
            age: 34  
        }        
    },
    template: `
                <div>
                    <p>Привет, {{ $data.name }}. Твой возраст {{ $data.age }}.</p>
                    <slot></slot>
                </div>
            `
})

Передаём атрибуты из основного компонента во вложенный, с помощью props.

Index.html

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- выводим компонент -->
        <mycomp></mycomp> 
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="comp.js"></script>
    <script src="main.js"></script>
</body>
</html>

main.js

const app = new Vue({
    el: '#app',
    data:{
        name: 'Антон',
        name2: 'Слава',
        age: 34,
        age2: 23,
    }
})

comp.js

Vue.component('mycomp', {
    template: `
                <div>
                    <iner-comp :x=10></iner-comp>
                </div>
            `
})
Vue.component('iner-comp', {
    props:['x'],
    template: `
                <div>
                    <p>{{ x }}.</p>                   
                </div>
            `
})

Все тоже самое но намного проще с помощью $parent и $root.

$parent — обращение к родительскому компоненту из дочернего. Если компонент всего один, то с помощью $parent обращаемся к свойствам main.js.

$root — обращение к свойствам main.js.

Vue.component('mycomp', {
    template: `
                <div>
                    <p>Привет, {{ $parent.name }}. Ваш возраст {{ $parent.age2 }}</p>
                </div>
            `
})

Обращаемся из вложеноого компонента к main.

Vue.component('mycomp', {
    template: `
                <div>
                    <p>Привет, {{ $parent.name }}. Ваш возраст {{ $parent.age }}</p>
                    <iner-comp></iner-comp>
                </div>
            `
})
Vue.component('iner-comp', {
    template: `
                <div>
                    <p>Привет, {{ $parent.$parent.name2 }}. Ваш возраст {{ $parent.$parent.age2 }}</p>                   
                </div>
            `
})

или так

Vue.component('mycomp', {
    template: `
                <div>
                    <p>Привет, {{ $root.name }}. Ваш возраст {{ $root.age }}</p>
                    <iner-comp></iner-comp>
                </div>
            `
})
Vue.component('iner-comp', {
    template: `
                <div>
                    <p>Привет, {{ $root.name2 }}. Ваш возраст {{ $root.age2 }}</p>                   
                </div>
            `
})

Если указать во вложенном компоненте $parent.name, то обратимся к локальной переменой name главного компонента, если она есть.

$refs

Можно обращатся к методом из другого компанента через ref атрибут. Допустим у нас есть index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <alert></alert>
        <cart ref="cart" ></cart>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
   
    <script src="alert.js"></script>
    <script src="cart.js"></script>
    <script src="main.js"></script>
</body>
</html>

Указываем в нем наши компонент, обратите внимание на компанент cart, у него появился тег ref. Создаем сам компонент cart:

Vue.component('cart', {
    data() {
        return {
            counter: 0
        }
    },
    template:
        ` 
        <div> 
            <span>{{ counter }}</span> 
        </div> 
        `,
    methods: {
        increase() {
            this.counter++;
        }
    }
})

Создаем компонент alert:

Vue.component('alert', {
    template: `
                <div>
                    <button @click="$root.$refs.cart.increase()"> GO </button>
                </div>
           `
})

Ну и main:

const app = new Vue({
    el: '#app'
})

Мы обратились из компанента alert к компаненту cart посреством $root.$refs.cart.increase().

Добавить комментарий