Python Web(十九)Vue的基本使用

Vue

Vue概述

Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。
Vue.js读音 /vjuː/, 类似于 view
Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API
Vue.js是一个构建数据驱动的Web界面的库
Vue.js是一套构建用户界面的 渐进式框架
通俗的说:
    Vue.js是一个构建数据驱动的 web 界面的渐进式框架
    Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件
    核心是一个响应的数据绑定系统

Vue.js使用文档
Vue.js下载
可视化学习网站

Vue基本使用

第一个Vue应用

文档

官方提供了两个包
    开发环境版本
    生产环境版本
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    {{ message }}
</div>


</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            message: 'Hello Vue'
        }
    })
</script>

</html>

data

基本语法

数据绑定最常见的形式就是使用“Mustache(胡子)”语法 (双大括号) 的文本插值
<span>{{ message}}</span>
Mustache 标签将会被替代为对应数据对象上message属性的值。无论何时,绑定的数据对象上message属性发生了改变,插值处的内容都会更新
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <span>{{ message }}</span> <br>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            message: 'Hello Vue!'
        }
    })
</script>
</html>
我们也可以通过改变Vue的分隔符来修改Mustache 标签
    delimiters: ['[[', ']]'],
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <span>[[message]]</span> <br>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        delimiters: ['[[', ']]'],
        data: {
            message: 'Hello Vue!'
        }
    })
</script>
</html>

v-bind绑定元素属性

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <span>{{ message }}</span> <br>
    <span v-bind:title="ads">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <br>
    <a v-bind:href="home" target="_blank">戳我有惊喜</a>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            message: 'Hello Vue!',
            ads: '页面加载于 ' + new Date().toLocaleString(),
            home: 'http://www.baidu.com/'
        }
    })
</script>
</html>
v-bind简写 <a :href="url">...</a>

if条件渲染

通过条件指令可以控制元素的创建(显示)或者销毁(隐藏)
    v-if
    v-else-if
    v-else
    v-show

v-if

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <span>{{ message }}</span> <br>
    <span :title="ads">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span> <br>
    <a :href="home" target="_blank" title="惊喜">戳我有惊喜</a> <br>
    <p v-if="seen">现在你看到我了</p>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            message: 'Hello Vue!',
            ads: '页面加载于 ' + new Date().toLocaleString(),
            home: 'http://www.baidu.com/',
            seen: true,  // seen为true能看到,为false看不到
        }
    })
</script>
</html>

v-if和v-else

<a href="#" v-if="islogin">个人中心</a>
<a href="#" v-else>登录</a>
v-else要紧跟v-if后边

v-if,v-else-if和v-else

<img src="" alt="皇帝" v-if="level === 1">
<img src="" alt="皇亲" v-else-if="level === 2">
<img src="" alt="国戚" v-else-if="level === 3">
<img src="" alt="大臣" v-else>

v-show

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <p v-if="seen" id="if">现在你看到我了</p>
    <p v-show="seen" id="show">现在你看到我了</p>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            seen: false
        }
    })
</script>
</html>
v-show用法和v-if大致一样,但是它不支持v-else,它和v-if的区别是,它制作元素样式的显示和隐藏,元素一直是存在的
注意在vue中使用v-show, 原来的css代码不能设置display属性, 会导致冲突

for 列表渲染

v-for指令可以绑定数组的数据来渲染一个项目列表
v-for指令需要使用item in items形式的特殊语法,items是源数据数组并且item是数组元素迭代的别名。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <ol>
        <li v-for="todo in todos">
            {{ todo.text }}
        </li>
    </ol>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            todos: [
                {text: '学习 JavaScript'},
                {text: '学习 Vue'},
                {text: '整个牛X项目'}
            ]
        }
    })
</script>
</html>
效果:
1.学习 JavaScript
2.学习 Vue
3.整个牛X项目

index

index下标从零开始

<ol>
    <li v-for="(todo,index) in todos">
        {{ todo.text }}-{{index}}
    </li>
</ol>
效果:
1.学习 JavaScript-0
2.学习 Vue-1
3.整个牛X项目-2

对象

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <ul>
        <li v-for="value in object">
            {{ value }}
        </li>
    </ul>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            object: {
                title: 'How to do lists in Vue',
                author: 'Jane Doe',
                publishedAt: '2016-04-10'
            }
        }
    })
</script>
</html>
效果:
·How to do lists in Vue
·Jane Doe
·2016-04-10

对象列表

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <ul>
        <li v-for="item in items">
            {{ item.title }}~~~{{item.author}}~~~{{item.publishedAt}}
        </li>
    </ul>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            items: [
                {
                    title: 'Vue',
                    author: 'Jane Doe',
                    publishedAt: '2016-04-10'
                },
                {
                    title: 'python',
                    author: 'Ricky',
                    publishedAt: '2019-04-10'
                },
                {
                    title: 'itcast',
                    author: 'itcast',
                    publishedAt: '2006-05-08'
                }
            ]
        }
    })
</script>
</html>
效果:
·Vue~~~Jane Doe~~~2016-04-10
·python~~~Ricky~~~2019-04-10
·html~~~Lucky~~~2006-05-08

methods事件

v-on

可以用v-on指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <button v-on:click="counter += 1">Add 1</button>
    <p>The button above has been clicked {{ counter }} times.</p>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            counter: 0
        }
    })
</script>
</html>
效果:

在这里插入图片描述

事件处理方法

然而许多事件处理逻辑会更为复杂,所以直接把 JavaScript 代码写在v-on指令中是不可行的。因此v-on还可以接收一个需要调用的方法名称
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <button v-on:click="add">Add 1</button>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            counter: 0
        },
        methods: {
            add: function () {
                counter += 1
                alert(this.counter)
            }
        }
    })
</script>
</html>

事件处理方法传递参数

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <button v-on:click="addnum(counter)">Add {{counter}}</button>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            counter: 1
        },
        methods: {
            addnum: function (num) {
                this.counter = num + this.counter
                alert(this.counter)
            }
        }
    })
</script>
</html>
v-on: 简写@

model表单绑定

单行文本框、多行文本框、单选框、多选框、下拉框
可以用v-model指令在表单<input>、<textarea>及<select>元素上创建双向数据绑定。
它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇。它负责监听用户的输入事件以更新数据,
并对一些极端场景进行一些特殊处理。
v-model会忽略所有表单元素的value、checked、selected特性的初始值而总是将 Vue 实例的数据作为数据来源。
你应该通过 JavaScript 在组件的data选项中声明初始值
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <table border="1">
        <tr>
            <td>用 户 名</td>
            <td><input type="text" v-model="username" @blur="checkusername"></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" v-model="password1"></td>
        </tr>
        <tr>
            <td>确认密码</td>
            <td><input type="password" v-model="password2"></td>
        </tr>
        <tr>
            <td>性别</td>
            <td><input type="radio" name="sex" value="boy" v-model="sex"><input type="radio" name="sex" value="girl" v-model="sex"></td>
        </tr>
        <tr>
            <td>爱好</td>
            <td>
                足球 <input type="checkbox" name="like" value="足球" v-model="like">
                篮球 <input type="checkbox" name="like" value="篮球" v-model="like">
                兵乓球<input type="checkbox" name="like" value="兵乓球" v-model="like">
            </td>
        </tr>
        <tr>
            <td>所在城市</td>
            <td>
                <select name="city" v-model="city">
                    <option value="北京">北京</option>
                    <option value="上海">上海</option>
                    <option value="广州">广州</option>
                    <option value="深圳">深圳</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>个人简介</td>
            <td><textarea name="desc" v-model="desc"></textarea></td>
        </tr>
    </table>
    <button @click="register">注册</button>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            username: '',
            password1: '',
            password2: '',
            sex: '',
            like: [],
            city: '',
            desc: ''

        },
        methods: {
            register: function () {

                alert(this.username + this.password1 + this.password2 + this.sex + this.like + this.city + this.desc)
            },
            checkusername: function () {
                alert(this.username)
            }
        }
    })
</script>
</html>

todolist案例

准备工作

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text">
    <button>添加</button>
    <hr/>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            items: ['学习Vue', '学习Django基础', '学习Django前台'],
        },
        methods: {}
    })
</script>
</html>

列表数据渲染

<ul>
    <li v-for="item in items">{{item}}</li>
</ul>

绑定数据能够添加到列表中


<body>
<div id="app">
    <input type="text" v-model="newitem">
    <button @click="addNetItem">添加</button>
    <hr/>
    <ul>
        <li v-for="item in items">{{item}}</li>
    </ul>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            items: ['学习Vue', '学习Django基础', '学习Django前台'],
            newitem: '',
        },
        methods: {
            addNetItem: function () {
                this.items.push(this.newitem);
                this.newitem = '';
            }
        }
    })
</script>
</html>

实现删除功能


<div id="app">
    <input type="text" v-model="newitem">
    <button @click="addNetItem">添加</button>
    <hr/>
    <ul>
        <li v-for="(item,index) in items">
            <span>{{item}}</span>
            <a href="javascript:;" @click="deleteItem(index)">删除</a>
        </li>
    </ul>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            items: ['学习Vue', '学习Django基础', '学习Django前台'],
            newitem: '',
        },
        methods: {
            addNetItem: function () {
                this.items.push(this.newitem);
                this.newitem = '';
            },
            deleteItem: function (index) {
                this.items.splice(index, 1)
            }
        }
    })
</script>
</html>

添加移动按钮,实现移动功能

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="newitem">
    <button @click="addNetItem">添加</button>
    <hr/>
    <ul>
        <li v-for="(item,index) in items">
            <a href="javascript:;" @click="upItem(index)"></a>
            <span>{{item}}</span>
            <a href="javascript:;" @click="downItem(index)"></a>
            <a href="javascript:;" @click="deleteItem(index)">删除</a>
        </li>
    </ul>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            items: ['学习Vue', '学习Django基础', '学习Django前台'],
            newitem: '',
        },
        methods: {
            addNetItem: function () {
                this.items.push(this.newitem);
                this.newitem = '';
            },
            deleteItem: function (index) {
                this.items.splice(index, 1);
            },
            upItem: function (index) {
                current = this.items[index];
                this.items.splice(index, 1);
                this.items.splice(index - 1, 0, current);
            },
            downItem: function (index) {
                current = this.items[index];
                this.items.splice(index, 1);
                this.items.splice(index + 1, 0, current);
            }
        }
    })
</script>
</html>

ES6语法

ES6语法介绍

ES6是JavaScript语言的新版本,它也可以叫做ES2015,之前学习的JavaScript属于ES5,
ES6在它的基础上增加了一些语法,ES6是未来JavaScript的趋势,而且vue组件开发中会使用很多的ES6的语法,所以掌握这些常用的ES6语法是必须的。

变量声明

ES6是JavaScript语言的新版本,它也可以叫做ES2015,之前学习的JavaScript属于ES5,ES6在它的基础上增加了一些语法,
ES6是未来JavaScript的趋势,而且vue组件开发中会使用很多的ES6的语法,所以掌握这些常用的ES6语法是必须的。
变量一定要在声明后使用,否则报错
var age = 10;
let:ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
{
  let a = 10;
  var b = 1;
}
上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,
结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

for循环的计数器,就很合适使用let命令。
    for (let i = 0; i < 10; i++) {}
    计数器i只在for循环体内有效,在循环体外引用就会报错。

const:const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;

JavaScript对象的写法

ES5的写法

var person = { 
    name:'python',
    age:13,
    say:function(){
        alert('hello')
    }
}

person.say()
还可以写成
var person = {};
person.name='itheima';
person.age=13;
person.say = function (){alert('hello')}
person.say();

ES6的写法

需要注意的是, 实现简写,有一个前提,必须变量名属性名一致
//定义变量
var name='python';
var age=13;
//创建对象
var person = {
    name,
    age,
    say:function(){
        alert('hello');
    }
};
//调用
person.say()

ES6的箭头函数

作用:
    定义函数新的方式
    改变this的指向
    定义函数新的方式
//无参数,无返回值
var say = ()=> {
    alert('我是无参数无返回值函数');
}
//有参数,无返回值
var eat = food => {
    alert('我喜欢吃'+food);
}
//有参数,有返回值
var total = (num1,num2) => {
    return num1+num2;
}
改变this的指向
如果层级比较深的时候, this的指向就变成了window, 这时候就可以通过箭头函数解决这个指向的问题

Vue示例生命周期

示例生命周期
在这里插入图片描述

各个生命周期函数的作用

beforeCreate
    vm对象实例化之前
created
    vm对象实例化之后
beforeMount
    vm将作用标签之前
mounted(重要时机初始化数据使用)
    vm将作用标签之后
beforeUpdate
    数据或者属性更新之前
updated
    数据或者属性更新之后

axios发送ajax请求

准备工程

创建一个django工程,例如 login.创建完成之后,再创建一个子应用,例如users.最后再设置一下模板文件

准备html和html显示

在模板文件中创建一个axios.html,内容如下
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <span>{{ message }}</span> <br>
    <a href="javascript:;">登录</a> <br>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        delimiters: ["[[", "]]"],
        data: {
            message: 'Hello Vue!',
        },
    })
</script>
</html>
创建视图并加载模板的html
# url设置
from django.conf.urls import re_path
from users.views import ShowLoginView

urlpatterns = [
    re_path(r'^show/$', ShowLoginView.as_view()),
]


# 视图
class ShowLoginView(View):

    def get(self, request):
        return render(request, 'axios.html')

导入axios,并发送GET/POST请求

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <!-- 开发环境版本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 导入axios -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app">
    <span>{{ message }}</span> <br>
    <span>[[ message ]]</span> <br>
    <a @click="login" href="javascript:;">登录-GET</a> <br>
    <a @click="login2" href="javascript:;">登录-GET2</a> <br>
    <a @click="login3" href="javascript:;">登录-POST</a> <br>
</div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        delimiters: ["[[", "]]"],
        data: {
            message: 'Hello Vue!',
        },
        methods: {
            login: function () {
                let url = 'http://127.0.0.1:8000/login/?username=admin&password=123';
                axios.get(url).then(response => {
                    if (response.data.code == '200') {
                        this.message = response.data.info.username;
                    } else if (response.data.code == '400') {
                        this.message = response.data.msg;
                    }
                }).catch(error => {
                    console.log(error)
                })
            },
            login2: function () {
                let url = 'http://127.0.0.1:8000/login/';
                axios.get(url, {
                    params: {
                        "username": "admin",
                        "password": "123"
                    }
                }).then(response => {
                    if (response.data.code == '200') {
                        this.message = response.data.info.username;
                    } else if (response.data.code == '400') {
                        this.message = response.data.msg;
                    }
                }).catch(error => {
                    console.log(error)
                })
            },
            login3: function () {
                let url = 'http://127.0.0.1:8000/login/';
                axios.post(url, {
                    "username": "admin",
                    "password": "123"
                }).then(response => {
                    if (response.data.code == '200') {
                        this.message = response.data.info.username;
                    } else if (response.data.code == '400') {
                        this.message = response.data.msg;
                    }
                }).catch(error => {
                    console.log(error)
                })
            }
        }
    })
</script>
</html>
因为Vue的模板变量和django的模板变量分隔符冲突,所以需要修改Vue的分隔符delimiters:["[[","]]"]
箭头函数解决这个指向的问题

后台代码

#定义路由
from django.conf.urls import re_path
from users.views import ShowLoginView, LoginView

urlpatterns = [
    re_path(r'^show/$',ShowLoginView.as_view()),
    re_path(r'^login/$',LoginView.as_view()),
]
#定义视图
class LoginView(View):
    def get(self, request):
        #获取参数
        username = request.GET.get('username')
        password = request.GET.get('password')
        #验证参数并返回相应
        if username == 'admin' and password == '123':
            return JsonResponse({'code': 200, 'msg':'ok','info': {'username': username, 'user_id': '666'}})
        else:
            return JsonResponse({'code': 400,'msg':'账号或密码错误'})

    def post(self, request):
        # 获取参数
        data = json.loads(request.body.decode())
        username = data.get('username')
        password = data.get('password')
        # 验证参数并返回相应
        if username == 'admin' and password == '123':
            return JsonResponse({'code': 200, 'msg':'ok','info': {'username': username, 'user_id': '666'}})
        else:
            return JsonResponse({'code': 400,'msg':'账号或密码错误'})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值