Vue | 基础语法快速入门

本文详细介绍了Vue.js的基本概念和核心特性,包括模板语法、基础指令(如分支判断、循环和事件绑定)、表单数据双向绑定、组件使用以及网络通信Axios。通过实例展示了Vue如何简化前端开发,实现数据驱动视图,并探讨了计算属性、插槽的使用和自定义事件分发。此外,还涵盖了Vue组件化开发和与后台交互的基本操作。
摘要由CSDN通过智能技术生成

一、初识 Vue.js

Vue.js 是啥 ?

  • Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
  • Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。
  • 当与现代化的工具链以及各种支持类库结合使用时,Vue 能够为复杂的单页应用提供驱动。

为啥要用 Vue.js ?
学过 jsp 与 php 的应该都知道,当前端页面要加载后台数据时,如发送 Ajax 请求,往往需要通过繁琐的修改 DOM 来更新数据。
有了 Vue.js,我们便可以轻轻松松地完成数据绑定工作,同时也避免大量的原生 javascript 或者是 jQuery 代码,给前端开发带来了很大的方便
除此之外,许多 UI 框架都会涉及到 Vue,因为其具有丰富的组件库
最后,Vue.js 是实现前后端分离的关键,其可以实现前端模块化与工程化开发

二、Vue.js 模板语法

Vue.js 的模板语法为:{{ data }},其中的 data 为需要显示的数据的变量名(即在 Vue 实例的 data 中定义的 key 值)
在写 Vue 之前,需引入其 CDN:

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

第一个 Vue 程序如下:

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

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                message: 'vue-01~~~',
            }
        });
    </script>

浏览器运行后会显示 js 中 Vue 实例对应的 data 的 message 值(这里为:vue-01~~~),我们无需与 HTML 直接交互,一个 Vue 应用可以挂载到一个 DOM 元素上,即 Vue 实例中 el 的 id 与 html 标签的 id 一一对应绑定,data 定义 Vue 应用的数据,如这里的 message,HTML 的 DOM 中只需通过模板(两个大括号)包裹 data 中定义的 key 即可显示对应的数据

三、Vue.js 基础指令

掌握了 Vue.js 的模板语法后,我们首先掌握一些基础指令的使用,同时以下的基础指令也是经常要用到的

1、分支判断

    <div id="app">
        <h1 v-if="date=='Yesterday'">昨天</h1>
        <h1 v-if="date=='Today'">今天</h1>
        <h1 v-else-if="date=='Tommrrow'">明天</h1>
        <h1 v-else>后天</h1>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                date: 'Today'
            }
        });
    </script>

date 的值为 Toady,则最终显示的是文本是“今天”

2、循环

    <div id="app">
        <li v-for = "(item, index) in items">
            第{{index}}个标签: {{item.message}}
        </li>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                items: [
                    {message: '昨天不够认真'},
                    {message: '今天加油冲'},
                    {message: '明天会更好'}
                ]
            }
        });
    </script>

v-for 标签类似于 for each 循环,在 javascript 中,方括号对应数组,大括号对应对象,需通过【对象.属性名】获取对象的属性值,
同时通过 index 参数,我们可以得到循环的索引,其默认从 0 开始

3、事件绑定

    <div id="app">
        <button v-on:click = "eventTest">Vue注册事件</button>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                message: '事件绑定学习'
            },
            methods: {
                eventTest: function() {
                    alert(this.message);
                }
            }
        });
    </script>

通过 v-on 绑定事件,v-on:click 表示绑定的是点击事件,绑定的事件需在 Vue 实例的 methods 中声明,注意不要少了 methods 末尾的 s

四、表单数据双向绑定

表单通过 v-model 实现数据双向绑定,当表单的数据发生变化时,对应 Vue 实例中 data 中相应变量的值也会发生变化
我们可将 Vue 实例中的变量回显出来,以查看双向绑定的效果,具体实例如下:

1、输入框

    <div id="app">
        输入:<input type="text" v-model = "message">
        回显:{{message}}
    </div>

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

运行效果如下:
在这里插入图片描述

2、文本域

    <div id="app">
        输入:<textarea name="" id="" cols="30" rows="10" v-model = "message"></textarea>
        回显:{{message}}
    </div>

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

运行效果如下:
在这里插入图片描述

3、单选框

    <div id="app">
        单选:
        <input type="radio" name="food" value="苹果" v-model="radioVal">苹果
        <input type="radio" name="food" value="西瓜" v-model="radioVal">西瓜
        <br>
        回显:{{radioVal}}
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                radioVal: ''
            }
        });
    </script>

运行效果如下:
在这里插入图片描述

4、下拉框

    <div id="app">
        下拉框:
        <select v-model = "selectVal">
            <option value="" disabled>请选择</option>
            <option>苹果</option>
            <option>西瓜</option>
            <option>芒果</option>
        </select>
        回显:{{selectVal}}
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                selectVal: ''
            }
        });
    </script>

运行效果如下:
在这里插入图片描述
可以看到,通过双向绑定,可以很容易地实现回显效果,比用原生 javascript 写简直方便太多

五、Vue 组件

组件 Component 是 Vue 中一个重要的概念。在前端模块化开发中,一个 web 页面是由一个个组件组合拼接而成的,我们可以很方便地对组件进行修改
通过定义组件,还可以实现自定义标签的效果

    <div id="app">
        <diytag v-for = "item in items" v-bind:mydata="item"></diytag>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <script>
        Vue.component("diytag",{
            props: ['mydata'],
            template: '<li>{{mydata}}</li>'
        });

        var vm = new Vue({
            el: "#app",
            data: {
                items: ["1st", "2nd", "3rd"]
            }
        });
    </script>

其中,divtag 为组件名,props 为组件接收的参数,template 为组件的模板(即我们通过引入自定义标签即可显示模板中的内容)
运行效果如下:
在这里插入图片描述

六、网络通信 Axios

Vue 中主要通过 Axios 与后台交互,其可以很方便的发送 Ajax 请求,同时对 data 中的变量的值进行更新
首先,引入 Axios 的 CDN

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

在当前目录下创建一个 data.json,用于模拟后端返回的 json 数据
data.json:

{
    "name": "今天要学习",
    "url": "https://www.baidu.com",
    "age": 3,
    "school": {
        "xiaoxue": "小学",
        "chuzhong": "初中",
        "gaozhong": "高中"
    },
    "friends": [
        {
            "name": "xiaoming",
            "age":1
        },
        {
            "name": "xiaohong",
            "age":2
        },
        {
            "name": "xiaohua",
            "age":3
        }
    ]
}

页面内容:

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>DEMO</title>
    <style>
        [v-clock] {
            display: none;
        }
    </style>
</head>

<body>
    <div id="app" v-clock>
        <div>{{info.name}}</div>
        <div>{{info.url}}</div>
        <div>{{info.school.xiaoxue}}</div>
        <div>{{info.friends[0].name}}</div>
        <a v-bind:href = "info.url">点击跳转</a>
    </div>

    <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>
        var vm = new Vue({
            el: "#app",
            data() {
                return {
                    info:{
                        name: null,
                        url: null,
                        age: null,
                        school: null,
                        friends: null
                    }
                }
            },
            mounted() {
                axios.get('data.json').then(response => (this.info = response.data));
            }
        });
    </script>
</body>

注意:
这里是 data() ,而不是 data:
并且 data() 内部需含 return,在 return 内部声明 json 的键值对形式(即需要定义与 json 中的键名一致的变量)。这种方式可将数据直接返回。同时,结合钩子函数 mounted(当视图被加载时会先执行该方法),可以实现组件数据初始化的操作。

七、计算属性

    <div id="app" v-clock>
        <div>function调用:{{currentTime1()}}</div>
        <div>计算属性调用:{{currentTime2}}</div>
    </div>

    <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>
        var vm = new Vue({
            el: "#app",
            data: {
                message : 'hello'
            },
            methods: {
                currentTime1: function() {
                    return Date.now();
                }
            },
            computed: {
                currentTime2: function() {
                    this.message;
                    return Date.now();
                }
            }
        });
    </script>

计算属性用于返回计算结果,其在 computed 中定义,类似于 function,但在调用计算属性时末尾没有括号!
运行效果如下:
在这里插入图片描述

八、插槽的使用

    <div id="app">
        <news>
            <news-title slot="news-title" :title = "title"></news-title>
            <news-items slot="news-items" v-for = "item in items" v-bind:item = "item"></news-items>
        </news>
    </div>

    <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>

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

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

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

        var vm = new Vue({
            el: "#app",
            data: {
                title: '插槽的使用',
                items: ['标签1','标签2','标签3']
            }
        });
    </script>

运行效果如下:
在这里插入图片描述
插槽相当于一个模板占位符,可以在一个大的模板中引入插槽 slot,slot 可以当成是内部更小的 Component,使得页面的标签更为组件化、模块化,语义更为清晰。同样地,Component 还是通过 props 参数接收 Vue 实例中的 data 参数值

九、自定义事件分发

这里要实现一个点击子标签旁边的按钮进行删除的操作,显然我们需要为子标签(即 li)所在的 Component 绑定一个删除事件,而这个删除的函数 removeItem 是在 Vue 实例中定义的,我们如何能够在组件内部调用 Vue 实例中的 function 呢?
此时就可以用到自定义事件分发了。我们在页面的 HTML 部分通过 v-on 给插槽的元素绑定一个自定义事件,名为 remove,它被赋值为 Vue 实例的 removeItem 删除方法(页面标签可以获取到 Vue 实例中的属性方法)。
然后在对应的组件内部定义名为 remove 的自定义函数,在其内部通过:

 this.$emit('自定义事件名',参数) 

来调用对应页面中绑定的 Vue 实例中的 removeItem 方法,参数为 index。
简单来说,就是通过页面标签的事件进行一个连接,然后在组件内部通过 this.$emit() 进行调用

    <div id="app">
        <news>
            <news-title slot="news-title" :title = "title"></news-title>
            <news-items slot="news-items" v-for = "(item, index) in items"
             v-bind:item = "item" v-on:remove="removeItem(index)" :index = "index"></news-items>
        </news>
    </div>

    <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>

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

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

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

        var vm = new Vue({
            el: "#app",
            data: {
                title: '自定义事件分发',
                items: ['标签1','标签2','标签3']
            },
            methods: {
                removeItem: function(index) {
                    this.items.splice(index,1);
                }
            }
        });
    </script>

运行效果如下:
在这里插入图片描述
附录:

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值