菜鸟的Vue基础快速入门

说明

本文参考了主要整理了一些Vue常用语法,给出相应代码,存在有大量不足的地方,建议参考Vue官网文档进行学习

注意:本文仅为记录学习轨迹,如有侵权,联系删除

一、前期准备

工具采用idea 2019,开始前下载Vue.js插件
在这里插入图片描述
设置vue新建文件模板
在这里插入图片描述
模板

<template>

</template>

<script>
    export default {
        name:"${NAME}"
    }
</script>

<style scoped>

</style>

二、常用方法

demo案例

跟后端一样,前端逐渐趋向于系统化,有条件语句、循环语句、自己的服务器(nodejs)、可独立运行、测试和部署,不可否认的是前端正在逐渐崛起。

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    {{ message }}
</div>

<!-- 导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:'#app',
        data:{
            message:'hello vue!'
        }
    })
</script>

</body>
</html>

引进虚拟Dom、MVVM模型等,具体概念查看Vue官网,这里主要展示代码,多玩一下代码就可以感受到Vue强大及其使用。
在这里插入图片描述

if-else

就跟后端的条件差不多

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app-1">
    <p v-if="seen">现在你看到我了</p>
    <p v-else>现在你看不到我了</p>
</div>

<div id="app-2">
    <p v-if="type=='A'">this is A</p>
    <p v-else-if="type=='B'">this is B</p>
    <p v-else-if="type=='C'">this is C</p>
    <p v-else>this is none</p>
</div>

<!-- 导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var app1 = new Vue({
        el: '#app-1',
        data: {
            seen: true
        }
    })

    var app2 = new Vue({
        el:'#app-2',
        data: {
            type: 'A'
        }
    })
</script>
</body>
</html>

for循环

这里的for循环语法跟python有点像

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul id="app-1">
    <li v-for="item in items">
       {{item.message}}
    </li>
</ul>

<ul id="app-2">
    <li v-for="(item, index) in items">
        {{ parentMessage }} - {{ index }}
        <p v-if="index == 0"> {{ item.message0 }}</p>
        <p v-if="index == 1"> {{ item.message1 }}</p>
        <p v-if="index == 2"> {{ item.message2 }}</p>
    </li>
</ul>


<!-- 导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var app1 = new Vue({
        el: '#app-1',
        data: {
            items:[
                {message:'第一个元素'},
                {message: '第二个元素'},
                {message: '第三个元素'}
            ]
        }
    })

    var app2 = new Vue({
        el: '#app-2',
        data: {
            parentMessage:'this is parent',
            items:[
                {message0: '第一个元素'},
                {message1: '第二个元素'},
                {message2: '第三个元素'}
            ]
        }
    })
</script>
</body>
</html>

事件绑定

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<button id="app-1" v-on:click="sayHello">click me</button>


<!-- 导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var app = new Vue({
        el:'#app-1',
        data:{
            message:'this is message'
        },
        methods:{
            //事件的绑定,方法必须定义在Vue的methods对象中,v-on:事件
            sayHello:function (event) {
                alert(this.message);
            }
        }
    })

</script>
</body>
</html>

异步请求(axios)

异步请求是最关键的一个技术

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异步请求(axios)</title>
</head>
<body>
<!--get的异步请求-->
<div id="app1">
    名字:{{info.data.name}}<br>
    年龄:{{info.data.age}}<br>
</div>
<hr>


<!--post的异步请求-->
<div id="app2">
    名字:{{info.data.name}}<br>
    年龄:{{info.data.age}}<br>
</div>
<hr>


<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">

    // get的异步请求
    new Vue({
        el: '#app1',
        data () {
            return {
                info: null
            }
        },
        mounted () {
            axios
                .get('../json/data.json')//这里一般请求后端的接口,接口返回一个json字符串
                .then(response => (this.info = response))//将请求返回的数据赋值给info
                .catch(function (error) { // 请求失败处理
                    console.log(error);
                });
        }
    })

    // post的异步请求
    new Vue({
        el: '#app2',
        data () {
            return {
                info: null
            }
        },
        mounted () {
            axios
                .post('../json/data.json')//这里一般请求后端的接口,接口返回一个json字符串
                .then(response => (this.info = response))//将请求返回的数据赋值给info
                .catch(function (error) { // 请求失败处理
                    console.log(error);
                });
        }
    })

</script>
</body>
</html>

组件基础

组件化开发,提高代码可复用性,详细参考Vue官网

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>组件基础</title>
</head>
<body>

<!--<p>组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是 <button-counter>。我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用:</p>-->
<div id="bc">
    <button-counter></button-counter><br>
    <button-counter></button-counter><br>
    <button-counter></button-counter><br>
    <button-counter></button-counter>
</div>
<hr>

<!--通过title给组件blog-post传值-->
<div id="bp1">
    <blog-post1 title="this is blog-1"></blog-post1>
    <blog-post1 title="this is blog-2"></blog-post1>
    <blog-post1 title="this is blog-3"></blog-post1>
</div>
<hr>

<!--自定义blog-post2组件,循环传值(复杂)-->
<div id="bp2">
    <blog-post2 v-for="item in items" v-bind:value="item"></blog-post2>
</div>
<hr>


<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    // 这里有两种组件的注册类型:全局注册和局部注册。至此,我们的组件都只是通过 Vue.component 全局注册的
    Vue.component('button-counter', {
        data: function () {
            return {
                count: 0
            }
        },
        template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
    })

    //自定义blog-post1组件,需要给title传值进去(简单)
    Vue.component('blog-post1',{
        props:['title'],
        template:'<h3>{{title}}</h3>'
    })

    //自定义blog-post2组件,循环传值(复杂)
    Vue.component('blog-post2',{
        props:['value'],
        template:'<h3>{{value}}</h3>'
    })



    new Vue({ el: '#bc' })

    new Vue({ el: '#bp1' })

    new Vue({
        el:'#bp2',
        data:{
            items:['A','B','C']
        }
    })


</script>
</body>
</html>

表单属性绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表单输入绑定</title>
</head>
<body>
<hr>
<div id="app-1">
    #文本 <br>
    <input v-model="message" placeholder="edit me">
    <p>Message is {{message}}</p>
</div>
<hr>

<div id="app-2">
    #多行文本 <br>
    <span>Multiline message is:{{message}}</span><br>
    <textarea v-model="message"></textarea>
</div>
<hr>

<div id="app-3">
    #复选框 <br>
    <input type="checkbox" id="jack" value="jack" v-model="checkedNames">
    <input type="checkbox" id="john" value="john" v-model="checkedNames">
    <input type="checkbox" id="mike" value="mike" v-model="checkedNames">
    <input type="checkbox" id="tony" value="tony" v-model="checkedNames">

    <p for="checkbox">Checked names: {{checkedNames}}</p>
</div>
<hr>


<div id="app-4">
    #单选按钮 <br>
    <input type="radio" id="mela" value="男" v-model="picked"><input type="radio" id="femela" value="女" v-model="picked"><p for="checkbox">Picked : {{picked}}</p>
</div>
<hr>

<div id="app-5">
    #选择框单选 <br>
    <select v-model="selected">
        <option disabled value="">---请选择---</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>

    <p>Selected: {{selected}}</p>
</div>
<hr>


<div id="app-6">
    #选择框多选 <br>
    <select v-model="selected" multiple style="width: 50px;">
        <option disabled value="">---请选择---</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>

    <p>Selected: {{selected}}</p>
</div>
<hr>


<!-- 导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: '#app-1',
        data: {
            message: ''
        }
    })

    new Vue({
        el: '#app-2',
        data: {
            message: ''
        }
    })

    new Vue({
        el: '#app-3',
        data: {
            // checkedNames: ''
            checkedNames: []
        }
    })

    new Vue({
        el:'#app-4',
        data:{
            picked:''
        }
    })

    new Vue({
        el:'#app-5',
        data:{
            selected:''
        }
    })

    new Vue({
        el:'#app-6',
        data:{
            selected:[]
        }
    })

</script>
</body>
</html>

计算属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计算属性</title>
</head>
<body>




<!-- 导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
       el:"#app1",
       data:{
           message:"hello world"
       },
        methods:{
           currentTime1:function () {
               return Date.now();//返回一个时间戳
           }
        },
        computed:{//计算属性(相当于缓存):metheds,computed方法名不能重名,重名之后之后调用methods的方法
           currentTime2:function () {
               this.message;
               return Date.now();//返回一个时间戳

           }
        }
    });
</script>
</body>
</html>

插槽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>插槽</title>
</head>
<body>

<div id="app1">
    <todo>
        <todo-title slot="todo-title" v-bind:title="title"></todo-title>
        <todo-items slot="todo-items" v-for="item in todoItems" v-bind:item="item"></todo-items>
    </todo>
</div>



<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>

    //slot
    Vue.component("todo",{
        template:'' +
            '<div>' +
            '   <slot name="todo-title"></slot>' +
            '   <ul>' +
            '       <slot name="todo-items"></slot>' +
            '   </ul>' +
            '</div>'
    });

    Vue.component('todo-title',{
        props:['title'],
       template: '<li>{{title}}</li>'
    });

    Vue.component('todo-items',{
        props: ['item'],
        template:'<li>{{item}}</li>'
    });

    new Vue({
        el:'#app1',
        data:{
            title:"this is title",
            todoItems:['C/C++','Java','Python']
        }
    });

</script>
</body>
</html>

自定义内容转发

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义内容分发</title>
</head>
<body>

<div id="app1">
    <todo>
        <todo-title slot="todo-title" v-bind:title="title"></todo-title>
        <todo-items slot="todo-items"
                    v-for="(item,index) in todoItems"
                    v-bind:item="item"
                    v-bind:index="index"
                    v-bind:key="index"
                    v-on:remove="removeItems(index)"></todo-items>
    </todo>
</div>



<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>

    //slot
    Vue.component("todo",{
        template:'' +
            '<div>' +
            '   <slot name="todo-title"></slot>' +
            '   <ul>' +
            '       <slot name="todo-items"></slot>' +
            '   </ul>' +
            '</div>'
    });

    Vue.component('todo-title',{
        props:['title'],
        template: '<li>{{title}}</li>'
    });

    Vue.component('todo-items',{
        props: ['item','index'],
        template:'' +
            '<li>' +
            '   {{item}}' +
            '   <button @click="remove">删除</button>' +
            '</li>',
        methods: {
            remove:function (index) {
                this.$emit('remove',index);
            }
        }
    });

   var vm =  new Vue({
        el:'#app1',
        data:{
            title:"this is title",
            todoItems:['C/C++','Java','Python']
        },
        methods:{
            removeItems:function (index) {
                console.log("删除了"+this.todoItems[index]+"OK");
                this.todoItems.splice(index,1);//一次删除一个元素
            }
        }
    });

</script>
</body>
</html>

三、补充

上面的一些方法,建议去官网了解了相关的概念后再看,在知道相关概念后学习效率最高,其次个人觉得只要看得懂代码,知道怎么用即可,没必要深究,毕竟现在时间宝贵,讲究高效学习,后面的开发也不会用这种原生的代码,很多都是用的框架,Vue则会使用Vue-cli脚手架进行快速开发和独立部署,即所谓的前后端分离。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值