Vue基础语法

        Vue.js 就是一个 MVVM 的实现者,他的核心就是实现了 DOM 监听 与 数据绑定.遵循SoC关注度分离原则,Vue是纯粹的视图框架,并不包含Ajax之类的通信功能,通信功能我们需要使用Axios框架做异步通信。

        Vue的开发都是要基于NodeJS,实际开发采用vue-cli做脚手开发,vue-router路由,vuex做状态管理;Vue UI,界面我们一般使用ElementUI快速搭建前端项目。

        下面的内容并不是真正的Vue程序,只是Vue的一些基础语法。

一、了解Vue程序:

        1、使用idea编写vue程序要下载vue插件

        2、创建一个html文件

        3、引入vue.js

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

        4、创建vue实例

        5、将数据绑定到页面元素(视图层)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--1、导入vue.js-->
   <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<body>

<!--绑定数据到视图层-->
<div id="app">
   {{message}}
</div>

<!--创建vue实例-->
<script type="text/javascript">
    var vm=new Vue({
        el:"#app",//绑定标签
        data:{
            message:"hello,vue"
        },
    });
</script>

</body>
</html>

        el:绑定元素的id

        data:数据对象中有一个名字为message的属性,并设置值为hello Vue

二、基础语法

        1、v-bind属性

<body>
<div id="app">
<!--
如果要将模型数据绑定在html属性中
则使用 v-bind 指令,此时title中显示的是模型数据
-->
<h1 v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</h1>
<!-- v-bind 指令的简写形式: 冒号(:) -->
<h1 :title="message">我是标题</h1>
</div>

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

new Vue({
    el: '#app',
    data: {
    message: '页面加载于 ' + new Date().toLocaleString()
    }
})
</script>
</body>

        2、v-if、v-else-if、v-else

<body>
    <div id="app">
    <!--
    === 三个等号在 JS 中表示绝对等于(就是数据与类型都要相等)
    -->
    <h1 v-if="type === 'A'">A</h1>
    <h1 v-else-if="type === 'B'">B</h1>
    <h1 v-else-if="type === 'C'">C</h1>
    <h1 v-else>who</h1>
</div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script>
    var vm = new Vue({
    el: '#app',
    data: {
    type: 'A'
    }
})
</script>
</body>

        ===在js中表示数据与类型都要相等

        3、v-for

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<!--导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<div id="app">
       <li v-for="(item,index) in items">
           {{item.message}}---{{index}}
       </li>
</div>
</body>

<script>
    var vm=new Vue({
        el:"#app",
        data:{
           items:[
               {message:'rk1你好'},
               {message:'rk2你好'},
               {message:'rk3你好'}
           ]
        }
    });
</script>
</html>

        4、v-on

        用于事件监听,给事件绑定方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>V-on</title>
</head>
<body>
<!--导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<div id="app">
    <br/>
    <button v-on:click="sayHi">click Me</button>
    <hr>
<!--    简写-->
    <button @click="sayHi">click Me</button>
</div>

<script>
    var vm=new Vue({
        el:"#app",
        data:{
            message:"rk学Vue"
        },
        methods:{//方法必须定义在Vue的methods对象中, v-on绑定事件
            sayHi:function () {
                alert(this.message+",你好,rk")
            }
        }
    });
</script>
</body>
</html>

        5、v-model双向数据绑定

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title]]</title>
</head>
<body>
<!--导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<div id="app">
    <div id="app2">
        下拉框
    <select v-model="luo">
        <option>--请选择--</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>
        你选中了:{{luo}}
    </div>
</div>

<script>
    var vm=new Vue({
        el:"#app2",
        data:{
            message:"123",
            rk:"男",
            luo:"没选"
        },
    });
</script>
</body>
</html>

        6、计算属性:computed

        计算属性的重点突出在 属性 两个字上(属性是名词),首先它是个 属性 其次这个属性有 计
算 的能力(计算是动词),这里的 计算 就是个函数;简单点说,它就是一个能够将计算结果缓存
起来的属性(将行为转化成了静态的属性),仅此而已;

        使用方法和methods类似,但是computed调用方法时使用的是属性名。computed的属性名不能和methods方法名相同,如果相同,只会调用methods的方法.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title]]</title>
</head>
<!--1、导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<body>
<div id="app">
    {{message}}
    <hr>
    currentTime1:{{currentTime1()}}<br>
    currentTime2:{{currentTime2}}
</div>

<!--创建vue实例-->
<script type="text/javascript">
    var vm=new Vue({
        el:"#app",//绑定标签
        data:{
            message:"hello,rk"
        },
        methods:{
            currentTime1:function () {
                return Date.now();//返回一个时间戳
            }
        },
        computed:{//计算属性 methods和computed中的方法名不能重名  如果重名只会调用methods中的方法
            currentTime2:function () {
                return Date.now();
            }

        }
    });
</script>

</body>
</html>

           methods:定义方法,调用方法使用 currentTime1(),需要带括号;
           computed:定义计算属性,调用属性使用 currentTime2,不需要带括号;计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;

三、组件

        1、注册组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<div id="app">
<!--     将vue中的值传给rk标签,rk标签将传过来的值绑定到props属性的luolin上-->
    <rk v-for="itemrk in items" v-bind:luolin="itemrk"></rk>

</div>

<script>
    //定义一个vue组件  名字叫rk
    Vue.component("rk",{
        props:['luolin'],
        template:'<li>{{luolin}}</li>'
    });

    var vm=new Vue({
        el:"#app",
        data:{
            items:["java","linux","前端"]
        }
    });
</script>
</body>
</html>

 说明:
        v-for="itemrk in items" :遍历 Vue 实例中定义的名为 items 的数组,并创建同等数量的件;
         v-bind:luolin="item" :将遍历的 item 项绑定到组件中 props 定义的名为 luolin属性上;
        = 号左边的 luolin为 props 定义的属性名,右边的为 itemrk in items 中遍历的 itemrk 项的值;

        2、插槽

        在 Vue 中我们使用 <slot> 元素,作为承载分发内容的出口,作者称其为 插槽,可以应用在组合组件的场景中;组件里面插组件,组合成为一个动态模块

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>插槽</title>
</head>
<body>
<!--1、导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<div id="rk">
    <vtable>
<!-- vtable-title组件插入属性值为vTitle的插槽中,该组件中的title值从data的t中获取-->
        <vtable-title slot="vTitle" v-bind:title="t"></vtable-title>
<!-- vtable-list组件插入属性值为vList的插槽中,该组件中的list值从data的li中获取-->
        <vtable-list slot="vList" v-for="itemm in li" v-bind:list="itemm"></vtable-list>
    </vtable>
</div>

</body>

<script type="text/javascript">

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


    Vue.component("vtable-list",//表的数据
        {
            props:["list"],
            template:'<li>{{list}}</li>'
        }
    )

    Vue.component("vtable",//表单组件
        {                   //插入两个组件,并定义其name属性值
            template: '<div>\
                           <slot name="vTitle"></slot>\
                            <ul>\
                           <slot name="vList"></slot>\
                           </ul>\
            </div>'
        }
    )

    var vue = new Vue({
        el:'#rk',
        data:{
          t:"vue",
          li:['rk学组件','rk学插槽','rk学计算属性']
        }
    });

</script>
</html>

 运行结果:

         3、自定义事件内容分发

        数据项在 Vue 的实例中,但删除操作要在组件中完成,那么组件如何才能删除Vue 实例中的数据呢?此时就涉及到参数传递与事件分发了,Vue 为我们提供了自定义事件的功能很好的帮助我们解决了这个问题;使用 this.$emit('自定义事件名', 参数)

        

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义事件</title>
</head>
<body>
<!--1、导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<div id="rk">
    <vtable>
        <!-- vtable-title组件插入属性值为vTitle的插槽中,该组件中的title值从data的t中获取-->
        <vtable-title slot="vTitle" v-bind:title="t" ></vtable-title>
        <!-- vtable-list组件插入属性值为vList的插槽中,该组件中的list值从data的li中获取-->
        <vtable-list slot="vList" v-for="(itemm,index) in li" v-bind:list="itemm"  :dex="index"
                        v-on:remove="removeList(index)"></vtable-list>
    </vtable>
</div>

</body>


<script type="text/javascript">

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


    Vue.component("vtable-list",//表的数据
        {
            props:["list","dex"],
            template:'<li>{{dex+1}}----{{list}} <button @click="remove">删除</button></li>',
            methods:{
                remove:function (dex) {
                    //自定义事件分发
                   this.$emit("remove",dex)//自定义数据remove,参数dex
                }
            }
        }
    )

    Vue.component("vtable",//表单组件
        {                   //插入两个组件,并定义其name属性值
            template: '<div>\
                           <slot name="vTitle"></slot>\
                            <ul>\
                           <slot name="vList"></slot>\
                           </ul>\
            </div>'
        }
    )


    var vue = new Vue({
        el:'#rk',
        data:{
            t:"vue",
            li:['rk学组件','rk学插槽','rk学计算属性']
        },
        methods: {
            removeList:function (index) {
                console.log("删除了"+this.li[index]+"oK")
                this.li.splice(index,1);//一次删除一个元素

            }
        }
    });

</script>
</html>

 四、Axios

        Axios 是一个开源的可以用在浏览器端和 NodeJS 的异步通信框架,她的主要作用就是实现 A JAX 异步通信,其功能特点如下:
        从浏览器中创建 XMLHttpRequests
        从 node.js 创建 http 请求
        支持 Promise API [ JS中链式编程 ]
        拦截请求和响应
        转换请求数据和响应数据
        取消请求
        自动转换 JSON 数据
        客户端支持防御 XSRF(跨站请求伪造)

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
</head>
<!--导入vue.js-->
<!--引入 JS 文件-->
<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"></script>
<style>
    /*解决闪烁*/
    [v-cloak]{
        display: none;//没加载完成前显示空白
    }
</style>
<body>
<div id="vue" v-cloak>
    <div>name:{{info.name}}</div>
    <div>page:{{info.page}}</div>
    url:<a v-bind:href="info.url">url:{{info.url}}</a>
    <div>地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}</div>
</div>
</body>
<script>
    var vue=new Vue({
        el:'#vue',//绑定标签

        data(){//data和data()不一样 data()里面的属性是通过返回的
            return{
                info:{//info里面要写data对应的属性,要赋值为空
                    name:null,
                    url:null,
                    page:null,
                    address:{
                        street:null,
                        city:null,
                        country:null
                    }
                }
            }
        },
        mounted(){//钩子函数   发出异步请求
            axios
                .get("data.json")//从data.json文件中获取
                .then(response=>(this.info=response.data));//给info赋值  类似于Lamda表达式 Es6新特性
        }
    })

</script>

</html>

data.json

{
  "name": "Rk学Vue",
  "url": "https://blog.csdn.net/m0_46979453?spm=1001.2101.3001.5343",
  "page": 3,
  "address": {
    "street": "西乡县",
    "city": "汉中市",
    "country": "中国"
  }
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rk..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值