Vue入门

Vue

了解

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

官网:https://cn.vuejs.org/

先建一个HelloWord玩玩

  1. 下载vue.js

    https://cdn.jsdelivr.net/npm/vue/dist/vue.js

  2. 创建一个静态项目

  3. 把下载好的vue.js导入项目

  4. 编写页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>hello-vue</title>
        <script src="/js/vue/vue.js"></script>
    </head>
    <body>
    
    <div id="app">
        {{ message }}
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                message: 'Hello Vue!'
            }
        })
    </script>
    </body>
    </html>
    
  5. 启动服务,看效果

vue的常见指令

{{}}

vue直接解析数据指令

v-bind

除了使用插值表达式{{}}进行数据渲染,也可以使用 v-bind指令,它的简写的形式就是一个冒号(:)

v-bind: 表示通知vue在渲染的 DOM 标签时,将bind绑定的属性 和 Vue 实例data中同名属性值保持一致。

例子

<div id="app">
    {{message}}
    <!--v-bind-->
    <span v-bind:title="title">看这里 看这里</span>
    <!--简写-->
    <span :title="title">简写方式</span>
</div>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
            title: "啦啦啦"
        }
    })
</script>

其他用法

绑定图片:v-bind:src 或者 :src

绑定样式:v-bind:class 或者 :class

绑定链接: v-bind:href 或者 :href

v-model

双向数据绑定和单向数据绑定:使用 v-model 进行双向数据绑定

功能与v-bind类似, 不过数据可同步改动

例子

<!--model双向绑定--->
<div id="app">
    <!--v-bind:表示数据单项绑定,可以给html标签属性绑定参数,如果html属性值改变,vue中data数据值不会变动  -->
    v-bind:<input type="text" name="name" v-bind:value="name">

    <!--v-model:表示双向绑定,绑定数据功能跟v-bind是一样的, 区别在如果htmle属性值改变, vue的data数据也会变动-->
    v-model:<input type="text" name="name" v-model:value="name">

    <br>
    <span>{{username}}</span>
</div>
<script>
    var vue = new Vue({
        el:"#app",
        data:{
            name:"小云"
        }
    })
</script>

v-html

双大括号会将数据解释为普通文本,而非 HTML 代码。如果说数据是带有html格式的数据时,此时需要使用v-html指令。

例子

<!--v-bind属性绑定--->
<div id="app">
    <!--{{content}}-->
    <a v-html="content"></a>
</div>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
           content:"<img src='https://cn.vuejs.org/images/logo.png'>"
        }
    })
</script>

效果

v-for

循环指令,可以绑定数组的数据来渲染一个项目列表

例子

<!--v-bind属性绑定--->
<div id="app">
    <!--遍历数组-->
    <li v-for="item in arr">{{item}}</li>
    <hr>
    <!--遍历数组 带下标-->
    <li v-for="(item, index) in arr">{{index}}-{{item}}</li>
    <hr>
    <!--遍历对象-->
    <li v-for="u in user">
        {{u.id}}--{{u.name}}--{{u.age}}
    </li>
</div>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
            arr:["a","b","c","d","d"],
            user:[
                {id:1,name:'xiaoyun', age:20},
                {id:2,name:'jiazhao', age:20},
                {id:3,name:'niexing', age:25},
                {id:4,name:'jiawen', age:28}
            ]
        }
    })
</script>

v-if

判断指令

例子

<!--v-bind属性绑定--->
<div id="app">
    <span v-if="age>18">进入本站</span>
    <span v-else-if="age<18">回家写作去</span>
    <span v-else="age<18">再努力下</span>
</div>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
           age:19
        }
    })
</script>

v-on

事件绑定指令, 可缩写成@

例子

<!--v-bind属性绑定--->
<div id="app">
    <input type="button" v-on:click="c" value="点我">
    <!--简写-->
    <input type="button" @click="c" value="再点一下">
</div>
<script>
    var vue = new Vue({
        el: "#app",
        data: {

        },
        methods:{
            c:function () {
                alert("ok了")
            }
        }
    })
</script>

缩写 ————来自官网

v- 前缀作为一种视觉提示,用来识别模板中 Vue 特定的 attribute。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀很有帮助,然而,对于一些频繁用到的指令来说,就会感到使用繁琐。同时,在构建由 Vue 管理所有模板的单页面应用程序 (SPA - single page application) 时,v- 前缀也变得没那么重要了。因此,Vue 为 v-bindv-on 这两个最常用的指令,提供了特定简写:

v-bind 缩写

<!-- 完整语法 -->
<a v-bind:href="url">...</a>

<!-- 缩写 -->
<a :href="url">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a :[key]="url"> ... </a>

v-on 缩写

<!-- 完整语法 -->
<a v-on:click="doSomething">...</a>

<!-- 缩写 -->
<a @click="doSomething">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a @[event]="doSomething"> ... </a>

它们看起来可能与普通的 HTML 略有不同,但 :@ 对于 attribute 名来说都是合法字符,在所有支持 Vue 的浏览器都能被正确地解析。而且,它们不会出现在最终渲染的标记中。缩写语法是完全可选的,但随着你更深入地了解它们的作用,你会庆幸拥有它们。

vue事件$event

事件信息封装对象: 使用 $event 标记

<div id="app">
    <!--
		$event:事件对象
		u.id  u.name:事件传参
	-->
    <li v-for="u in user" @click="choseClick($event, u.id, u.name)">
        {{u.id}}--{{u.name}}--{{u.age}}
    </li>
</div>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
            user:[
                {id:1,name:'xiaoyun', age:20},
                {id:2,name:'jiazhao', age:20},
                {id:3,name:'niexing', age:25},
                {id:4,name:'jiawen', age:28}
            ]
        },
        methods:{
            choseClick : function (e,id,name) {
                console.log(e);
                console.log(e.currentTarget);//获取事件源
                console.log(id);
                console.log(name);
            }
        }
    })
</script>

vue的属性

<div id="app">
    <li v-for="u in user" @click="choseClick($event, u.id, u.name)">
        {{u.id}}--{{u.name}}--{{u.age}}--{{u.sex|sexFilter}}
    </li>
</div>
<script>
    var vue = new Vue({
        el: "#app", //用来指示vue编译器从什么地方开始解析 vue的语法
        data: { //用来组织从view中抽象出来的属性,可以说将视图的数据抽象出来存放在data中
            user: [
                {id: 1, name: 'xiaoyun', age: 20, sex: 1},
                {id: 2, name: 'jiazhao', age: 20, sex: 1},
                {id: 3, name: 'niexing', age: 25, sex: 0},
                {id: 4, name: 'jiawen', age: 28, sex: 0}
            ]
        },
        methods: { //放置页面中的业务逻辑,js函数一般都放置在methods中
            choseClick: function (e, id, name) {
                console.log(e);
                console.log(e.currentTarget);
                console.log(id);
                console.log(name);
            }
        },
        filters: { //vue过滤器集合
            sexFilter: function (sex) {
                return sex == 0 ? '女' : '男';
            }
        },
        mounted: function () { //是一个函数, 在vue实例创建完成后被立即调用(html加载完成后执行)
            console.log("初始化")
        }
    })
</script>

vue生命周期

综合案例

  1. 准备一个user表

  2. 创建一个新web项目

  3. UserController的返回都是json格式,因为使用restful风格

    这里说明:
    可以使用标准的Restful风格,
    也可以使用以前常规的见名知义的url。

  4. 配置接口

    两个项目都是运行Tomcat启动一个是外部的,一个是SpringBoot内嵌的,Tomcat的默认端口是8080,所以要配置一个项目的接口

    server.port=8088
    
  5. 建立跨域访问

    什么是跨域访问?

    跨域是指跨域名的访问,以下情况都属于跨域:

    跨域原因说明示例
    域名不同www.jd.com 与 www.taobao.com
    域名相同,端口不同www.jd.com:8080 与 www.jd.com:8081
    二级域名不同item.jd.com 与 miaosha.jd.com

    步骤1:接口启动类中:

    ​ 引用接口 implements WebMvcConfigurer

    步骤2:跨域访问配置

    //跨域访问
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurer() {
                @Override
                //重写父类提供的跨域请求处理的接口
                public void addCorsMappings(CorsRegistry registry) {
                    //添加映射路径
                    registry.addMapping("/**")
                            //放行哪些原始域
                            .allowedOrigins("*")
                            //是否发送Cookie信息
                            .allowCredentials(true)
                            //放行哪些原始域(请求方式)
                            .allowedMethods("GET", "POST", "PUT", "DELETE","OPTIONS")
                            //放行哪些原始域(头部信息)
                            .allowedHeaders("*")
                            //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
                            .exposedHeaders("Header1", "Header2");
                }
            };
        }
    
  6. 在前端项目里创建用户列表和用户编辑页面,后端实现接口

代码

用户列表页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>user列表</title>
    <script src="/js/vue/vue.js"></script>
    <script src="../../js/jquery/jquery.js"></script>
</head>
<body>
<div id="app">
    <a href="input.html">添加</a>
    <table border="1" cellspacing="0">
        <tr>
        <td>id</td>
        <td>name</td>
        <td>age</td>
        <td>hobby</td>
        <td>操作</td>
        </tr>
        <tr v-for="u in user">
            <td>{{u.id}}</td>
            <td>{{u.name}}</td>
            <td>{{u.age}}</td>
            <td>{{u.hobby}}</td>
            <td>
                <a :href="'input.html?id='+u.id">编辑</a>
                <a href="#" @click="c(u.id)" >删除</a>
            </td>
        </tr>

    </table>
</div>

<script>
    var vue = new Vue({
        el: "#app",
        data: {
            user: []
        },
        methods:{
            c:function (id) {
                $.get("http://localhost:8088/users/del",{id:id},function (data) {
                    if(data.success){
                        alert("删除成功");
                        window.location.reload(true);
                    } else {
                        alert("删除失败")
                    }
                })
            }
        },
        mounted: function () {
            $.get("http://localhost:8088/users/list",{},function (data) {
                console.log(data);
                vue.user=data;
            })
        }
    })
</script>
</body>
</html>

用户编辑页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>input</title>
    <script src="../../js/jquery/jquery.js"></script>
    <script src="../../js/jquery-form/jquery.form.js"></script>
    <script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
    <form id="formId">
        <input type="hidden" name="id" v-model="user.id">
        名称:<input type="text" name="name" v-model="user.name"><br>
        年龄:<input type="text" name="age" v-model="user.age"><br>
        爱好:
        <input type="checkbox" name="hobby" value="c" v-model="user.hobby">c
        <input type="checkbox" name="hobby" value="go" v-model="user.hobby">go
        <input type="checkbox" name="hobby" value="python" v-model="user.hobby">python
        <input type="checkbox" name="hobby" value="java" v-model="user.hobby">java<br>

        <input type="button" id="btn" @click="submitForm()" value="提交"></input>
    </form>
</div>

<script>
    //获取url上的请求参数
    function getParams() {
        //获取问号及问号后面的内容
        var url = window.location.search;
        var params = new Object();
        if (url.indexOf("?") != -1) {
            //截取问号后面的内容,再使用&分割多个属性
            var arr = url.substr(1).split("&");
            for (var i = 0; i < arr.length; i++) {
                //使用=分割为keyvalue
                var keyValue = arr[i].split("=");
                params[keyValue[0]] = keyValue[1];
            }
        }
        return params;
    }

    var vue = new Vue({
        el: "#app",
        data: {
            user: {
                hobby:[]
            }
        },
        methods: {
            submitForm: function () {
                $("#formId").ajaxSubmit({
                    url: "http://localhost:8088/users/saveOrUpdate",
                    type: "post",
                    success: function (data) {
                        if (data.success) {
                            window.location.href = "index.html"
                        }
                    }
                })
            }
        },
        mounted: function () {
            var id = getParams().id;
            if (id) {
                $.get("http://localhost:8088/users/get", {id: id}, function (data) {
                    vue.user = data;
                })
            }
        }
    })
</script>
</body>
</html>

UserController

@RestController
@RequestMapping("users")
public class UsersController {
    @Autowired
    private IUsersService usersService;

    @GetMapping("list")
    public Object list(){
        return usersService.listAll();
    }

    @PostMapping("saveOrUpdate")
    public Object saveOrUpdate(@ModelAttribute("user") Users users){
        if(!StringUtils.hasLength(users.getId())){
            usersService.save(users);
        } else{
            usersService.update(users);
        }
        return new JsonResult();
    }

    @GetMapping("get")
    public Object get(String id){
        return usersService.get(id);
    }

    @GetMapping("del")
    public Object del(String id){
        usersService.delete(id);
        return new JsonResult();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小云很优秀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值