ajax和vue.js

简介: ajax和vue.js

1.前情回顾

return false 阻止事件冒泡;阻止表单提交

delegate 事件委托,子级不方便做,委托给父级做,既能给已有的绑定事件,又能给未来元素绑定。

json要写字符串,这是格式


2.***AJAX

ajax每个国家的读法都不一样,听起来像知道就可以了。

ajax只是jq一个函数而已,用来做数据交互的。

我们就是为了做数据交互,才调用ajax。

ajax依赖于HTTP协议,去发送请求。

ajax是默认支持异步传输数据;

默认支持局部刷新/无刷新。


同步:低效的,一件一件事情的干。

异步:高效的,一次干多件事(ajax在发送数据的时候,也能接收数据)


ajax包含请求和发送两个概念。

ajax不支持连接数据库。(原因是ajax依赖HTTP协议,不同语言协议不同)解决办法就是数据接口(一套python程序而已: 创建数据连接,查询取数据,数据写入) -- 出一个接口文档给前端(前端不懂后端程序,把每个接口的描述信息完整给前端,才能数据交互:接口作用、地址、参数 – 是否需要发送数据,返回的数据模板)


ajax请求数据接口(不同语言连接数据库的程序),数据接口去向数据库请求数据,然后发送给ajax。

web.py框架应用程序就是由n多个接口组成的。


当公司分工很明确的时候,那么ajax前半段由前端做,数据接口和数据库由后端程序员做。


后端数据接口名是什么,必须清楚的告诉前端。前端和后端重叠的部分就是数据接口名,必须先协商好。为了将来请求不出错。如果没有协商的话,那么就在写完一个接口程序的时候就要写一个接口描述文档(数据接口的名字,作用,参数,返回的模板数据“要的是key名”)


前端里面的字典对象,想访问key的值的时候并不是中括号了,而是.点后面跟着key

数据显示都是一个逻辑,遍历数据,然后将模板中的数据替换掉。

工作中$.ajax()中只配置基本参数,success拿到ajax函数外面变成done(),error拿到ajax函数外面变成fail(),采用链式编程的写法,一直将done和fail写在后面打点即可。也可以直接回车换行,只是为了美观,逻辑没变。这样只是为了让ajax看的干净一点,然后便于维护一些而已。


get方式就是获取数据,get支持的url字符数最大是1024个,get发数据是直接在url地址后面发送

post方式就是发送数据,post支持的url字符数更多。post会打一个http包,然后再发送数据,更加的安全。


简写的方式中,code是发送的数据,是一个字典的形式,可以加多个数据,后面只有一个回调函数(是成功后的事件),不支持失败后的事件。如果工作中不介意这些,那么可以采用简写的方式。在简写的格式中要注意一个问题,那就是发送的数据类型是json要在括号里面末尾加上,用引号直接写json就可以了,如果不写的话,会显示变量为被定义。一定能要记住这一点。


接口文档里面的信息一定写全了,如果是返回值的格式没告诉前端,前端可以从后台调数据,凭经验判断。但是为了同事之间相处的更加的融洽,还是写的明明白白的。


允许自定义html属性,已完成自己需要的功能。满足k=‘xx’而且名称符合标识符规则。访问自定义html属性时用attr这个。和prop用法完全一样。


自己写ajax的时候一定要注意括号,比如done和fail是跟在ajax后面的括号,如果显示错误,很大可能是这个问题,练习的时候在这个地方多次出现问题,不报错,但是有部分功能不出效果。


项目中ajax很常用,但是用的时候很容易忘记。在项目开始之前,自己先复习一下ajax的参数和函数多看看,了解一下每个参数怎么用。

1<!DOCTYPE html>
  2<html lang="zh-CN">
  3<head>
  4    <meta charset="utf-8">
  5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6    <meta name="viewport" content="width=device-width, initial-scale=1">
  7    <title>首页 - 个人选股系统 V5.87</title>
  8    <link href="/css/bootstrap.min.css" rel="stylesheet">
  9    <script src="/js/jquery-1.12.4.min.js"></script>
 10    <!-- <script>
 11        $(function(){
 12            $.ajax({
 13                // 配置ajax的参数
 14                // url:'请求数据的接口地址'
 15                url:'/index_data',
 16                // type:请求方式
 17                type:'get',
 18                // dataType:返回的数据格式 html  xml  ***json  text
 19                dataType: 'json',
 20                // data:{}  发送的数据
 21                // success:请求成功之后要执行的命令 -- 回调函数
 22                success: function(dat){
 23                    // 接收数据,显示数据
 24                    console.log(dat)
 25                    var str = '<tr><th>序号</th><th>股票代码</th><th>股票简称</th><th>涨跌幅</th><th>换手率</th><th>最新价(元)</th><th>前期高点</th><th>前期高点日期</th><th>添加自选</th></tr>';
 26                    // alert(dat)
 27                    // 遍历dat 一个表头 + 94个tr数据 -- 将这95个tr放到表格里面
 28                    for(var i=0;i<dat.length;i++)
 29                    {
 30                        // -1-- 字典对象里面的id值  00007 -- 字典里面的code值
 31                        str += '<tr><td>'+ dat[i].id +'</td><td>'+ dat[i].code+'</td><td>'+ dat[i].sname+'</td><td>10.01%</td><td>4.40%</td><td>全新好</td><td>16.05</td><td>2017-07-18</td><td><input type="button" value="添加" name="toAdd"></td></tr>';
 32                    }
 33
 34                    $('.table').html( str )
 35                },
 36                // error 请求失败之后要执行的命令 -- 回调函数
 37                error: function(){
 38                    alert('请求超时')
 39                }
 40            })
 41        })
 42    </script> -->
 43    <!-- ajax函数内部工作中只配置基本参数,success拿到ajax函数的外面变成done(),error拿到ajax函数的外面变成fail() -->
 44    <!-- <script>
 45    $(function(){
 46        $.ajax({
 47            url:'/index_data',
 48            type:'get',
 49            dataType:'json'
 50        })
 51        .done(function(dat){
 52            // 成功
 53            var str = '<tr><th>序号</th><th>股票代码</th><th>股票简称</th><th>涨跌幅</th><th>换手率</th><th>最新价(元)</th><th>前期高点</th><th>前期高点日期</th><th>添加自选</th></tr>';
 54                    // alert(dat)
 55                    // 遍历dat 一个表头 + 94个tr数据 -- 将这95个tr放到表格里面
 56                    for(var i=0;i<dat.length;i++)
 57                    {
 58                        // -1-- 字典对象里面的id值  00007 -- 字典里面的code值
 59                        str += '<tr><td>'+ dat[i].id +'</td><td>'+ dat[i].code+'</td><td>'+ dat[i].sname+'</td><td>10.01%</td><td>4.40%</td><td>全新好</td><td>16.05</td><td>2017-07-18</td><td><input type="button" value="添加" name="toAdd"></td></tr>';
 60                    }
 61
 62                    $('.table').html( str )
 63        })
 64        .fail(function(){
 65            alert('请求失败')
 66        })
 67    })
 68    </script> -->
 69    <script>
 70        $(function(){
 71            $.get('/index_data', function(dat){
 72                var str = '<tr><th>序号</th><th>股票代码</th><th>股票简称</th><th>涨跌幅</th><th>换手率</th><th>最新价(元)</th><th>前期高点</th><th>前期高点日期</th><th>添加自选</th></tr>';
 73                    // alert(dat)
 74                    // 遍历dat 一个表头 + 94个tr数据 -- 将这95个tr放到表格里面
 75                    for(var i=0;i<dat.length;i++)
 76                    {
 77                        // -1-- 字典对象里面的id值  00007 -- 字典里面的code值
 78                        str += '<tr><td>'+ dat[i].id +'</td><td>'+ dat[i].code+'</td><td>'+ dat[i].sname+'</td><td>10.01%</td><td>4.40%</td><td>全新好</td><td>16.05</td><td>2017-07-18</td><td><input type="button" value="添加" name="toAdd" data-code="'+dat[i].code+'"></td></tr>';
 79                    }
 80
 81                    $('.table').html( str )
 82            }, 'json')
 83
 84
 85            // 增加关注
 86            // 添加按钮 单击,把股票code值发送到接口 -- 接口返回不要重复添加或关注成功文字
 87            // $('input').click(function(){
 88            //     alert(1)
 89            // })
 90            $('.table').delegate('input', 'click', function(){
 91                // alert(2)
 92                // k="v" 自定义html属性的形式获取code值
 93
 94                // 访问自己这个input标签的data-code属性值即可
 95                // prop只能访问控制w3c定义的html属性,自定义的用attr函数访问和控制,attr和prop的用法完全相同
 96                // alert($(this).prop('data-code'))
 97                // alert($(this).attr('data-code'))
 98                var myCode = $(this).attr('data-code')
 99                $.ajax({
100                    url:'/add_data',
101                    type:'get',
102                    dataType:'text',
103                    data:{code: myCode}
104                })
105                .done(function(dat){
106                    alert(dat)
107                })
108                .fail(function(){
109                    alert('请求超时')
110                })
111            })
112
113        })
114    </script>
115</head>
116
117<body>
118<div class="navbar navbar-inverse navbar-static-top ">
119        <div class="container">
120        <div class="navbar-header">
121                <button class="navbar-toggle" data-toggle="collapse" data-target="#mymenu">
122                        <span class="icon-bar"></span>
123                        <span class="icon-bar"></span>
124                        <span class="icon-bar"></span>
125                 </button>
126                 <a href="#" class="navbar-brand">选股系统</a>
127        </div>
128        <div class="collapse navbar-collapse" id="mymenu">
129                <ul class="nav navbar-nav">
130                        <li class="active"><a href="">股票信息</a></li>
131                        <li><a href="/center.html">个人中心</a></li>
132                </ul>
133        </div>
134        </div>
135</div>
136<div class="container" id="container">
137
138    <div class="container-fluid">
139        <table class="table table-hover">           
140
141
142            <!-- <tr><th>序号</th><th>股票代码</th><th>股票简称</th><th>涨跌幅</th><th>换手率</th><th>最新价(元)</th><th>前期高点</th><th>前期高点日期</th><th>添加自选</th></tr>
143            <tr><td>1</td><td>000007</td><td>全新好</td><td>10.01%</td><td>4.40%</td><td>全新好</td><td>16.05</td><td>2017-07-18</td><td><input type="button" value="添加" name="toAdd"></td></tr>  -->
144
145
146        </table>
147    </div>
148</div>
149
150</body>
151</html>

2.1总结:

2.1.1ajax的写法

$ajax({ajax的参数})

url:接口地址(因为不支持链接数据库,协议不一样,所以需要接口地址。)

type: 请求方式 get:url发送数据    post:打包http包

datatype: 返回的数据格式

success:成功

error:失败


2.1.2工作中的写法

***success 换成 done()   error 换成 fail()


2.1.3化简写法

如果完成的ajax函数意愿type类型为get,化简写成$.get();如果意愿type类型是post,化简写成$.post();

参数1:url的值

参数2:发送数据的值 data

参数3:成功的回调函数

参数4:返回的数据格式


3.了解VUE

Vue.js是前端三大新框架之一,

中国人 尤雨溪  2014年研发出来的 --- vue不兼容低版本浏览器

vue注重数据,只要数据变化,页面视图随着数据的变化而变化。

jQuery能做的,vue也能做。

vue厉害的地方有数据处理、动画、组件(一个模块性的东西,有html有css有js,将这些封装到一起。)

vue-project是组件开发用到的,前端的叫做webpack,提到webpack等都是开发组件。这些都是前端用到的。

后端学习的重点在数据处理相关的。


MVC  model(数据相关的)  view(页面视图相关的) controller(控制器)  -----Angular.js、React.js

MVVM model   view  viewmodel(数据和页面视图相关的隐形的控制变化) -----vue(修改数据或者页面视图的时候,不用担心出事,viewmodel帮我们处理。只需要控制好数据和页面视图,中间的所有处理是viewmodel相关的)


后端将vue当做函数库来用即可

vue.js 和vue.mini.js(用的到的)

mini做过压缩


开发的时候导入vue.js,因为有调试工具,但是在项目上线之前一定要换成mini

4***VUE的基本使用

vue先导入

id名一般用app

vue的使用是从一个vue对象开始的

4.1 创建vue对象

var vm = new Vue({

el:"xx",

data:{

str:'xx'

}

methods:{

function(){}

}

})

vm是前端常用的一个对象名,viewmodel,官方文档这么写的。

配置vue对象的参数

el:''---------查找标签element的缩写

data:{}---------vue对象的数据区域


4.2数据显示{{ 数据 }}

vue对象的数据显示是从mustache语法开始的{{数据}}两个大括号之间一定不要有空格mustache只能显示一个数据,如果要再发送那么再写一个{{数据}}

记得写在前面的时候要写入口,但是vue没有入口函数。但是可以使用js的入口函数。

在工作中,项目定了用jq开发就不使用vue了。

工作中使用vue的时候,一般不写入口函数,而是把vue的代码粘贴到标签的后面,只要保证标签先执行就可以了。


如果vue中data有很多数据的处理情况:app中写标签,一个标签写一个{{数据}}

1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7    <title>Document</title>
 8    <script src="js/vue.min.js"></script>
 9
10</head>
11<body>
12    <!-- 数据显示从mustache 开始  {{ 数据 }} -->
13    <div id="app">{{ str }}</div>
14    <script>
15            // window.onload = function(){
16            // vue的使用是从一个VUE对象开始的
17            var vm = new Vue({
18                // 配置vue对象的参数
19                // el:查找标签
20                el:'#app',
21                data:{
22                    // vue对象的数据区域
23                    str: 'hello world'
24                }
25            })
26        // }
27        </script>
28</body>
29</html>

5.VUE模板语法

5.1 数据显示

vue控制了父级,就有权限控制这个父级的所有子级。

简单的运算mustache也支持

mustache还支持一些长的命令

mustache还可以输出三元表达式    三元运算符(简易版的if else)


三元表达式:条件?条件成立的命令:条件不成立的命令

三元运算符是js中的知识点,原生js就有

5.2vue控制HTML属性

超链接中的href在vue中可以不写死具体的路径和网址。

vue控制html属性有两种写法:

1.v-bind:href=

2.:href=

注意上面的两种方式都是在href前面写


上面的是控制超链接,其他的所有的html属性都是如此

v-bind:属性

:属性


v-xxx 都代表指令(具有特殊功能的属性),v-bind是控制html属性

1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7    <title>Document</title>
 8    <script src="js/vue.min.js"></script>
 9</head>
10<body>
11    <!-- vue控制了父级 就有权限控制这个父级的所有子级 -->
12    <div id="app">
13        <!-- {{ str }}  {{ num }} -->
14        <div>{{ str }}</div>
15        <div>{{ num }}</div>
16        <p>{{ num + 1}}</p>
17        <p>{{ str.split('').reverse().join('') }}</p>
18        <!-- js:三元运算符 三元表达式 -- 简易版的if else  -->
19        <!-- <div>{{ 条件?条件成立的命令:条件不成立的命令}}</div> -->
20        <div>{{ num==0?'等于0': '不等于0'}}</div>
21        <!-- v-bind  v-xx  指令 具有特殊功能的命令 -->
22        <a v-bind:href="url1">超链接</a>
23        <a :href="url2">超链接2</a>
24    </div>
25    <script>
26        var vm = new Vue({
27            el:'#app',
28            data:{
29                str: 'abcdefg',
30                num:1,
31                url1:'http://www.taobao.com',
32                url2:'http://www.itcast.cn'
33            }
34        })
35    </script>
36</body>
37</html>

5.3控制class属性

其实控制的是它属性值变化。js和jq都可以

v-bind:或者:   后面跟着class,动态的控制class


1.class取值可以为字典(字典里面是布尔型的数据)

2.class属性值可以传对象引用

3.class属性值还可以是数组

如果是字典:真实类名:布尔型数据,true添加类,false不添加类

data中,自定义类名:真实类名


4.数组里面还可以写三元运算符(最重要的)

:class="[三元运算符]"

条件成立加一个类,条件不成立来一个空类名

这种写法工作中最常用。

1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7    <title>Document</title>
 8    <script src="js/vue.min.js"></script>
 9</head>
10<!DOCTYPE html>
11<html lang="en">
12<head>
13    <meta charset="UTF-8">
14    <meta name="viewport" content="width=device-width, initial-scale=1.0">
15    <meta http-equiv="X-UA-Compatible" content="ie=edge">
16    <title>Document</title>
17    <script src="js/vue.min.js"></script>
18</head>
19<body>
20    <div id="app">
21        <!-- 字典  对象  数组  *******数组里面写三元运算符 -->
22        <!-- 字典:真实类名:布尔型数据,true添加类,false则不添加类 -->
23        <div :class="{myclass1: bool1, myclass2: bool2}">1111111</div>
24        <div :class="myobject">2222</div>
25        <div :class="[isClass6, isClass7]">33333</div>
26        <div :class="[bool2?'daqiu':'dongxiao']">44444</div>
27        <div :class="[bool1?'banzhang':'']">55555</div>
28    </div>
29    <script>
30        var vm = new Vue({
31            el:'#app',
32            data:{
33                bool1:false,
34                bool2:true,
35                myobject:{
36                    myclass4: true,
37                    myclass5: false
38                },
39                // 自定义的key   真实类名
40                isClass6: 'class6',
41                isClass7: 'class7'
42            }
43        })
44    </script>
45</body>
46</html>

6.***vue的事件与函数

标签身上写事件

v-on:事件属性=“命令”

methods:{函数名:匿名函数}

this.属性名或者对象名:属性

标签里调用上面的函数@事件属性="函数名()"如果有参数必须写括号(就是函数名后面的括号)


6.1事件绑定

v-on:事件属性=“”

@事件属性=“”


6.2封装函数

当前对象添加一个参数

methods:{

      函数名: 匿名函数

}

1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7    <title>Document</title>
 8    <script src="js/vue.min.js"></script>
 9</head>
10<!DOCTYPE html>
11<html lang="en">
12<head>
13    <meta charset="UTF-8">
14    <meta name="viewport" content="width=device-width, initial-scale=1.0">
15    <meta http-equiv="X-UA-Compatible" content="ie=edge">
16    <title>Document</title>
17    <script src="js/vue.min.js"></script>
18</head>
19<!DOCTYPE html>
20<html lang="en">
21<head>
22    <meta charset="UTF-8">
23    <meta name="viewport" content="width=device-width, initial-scale=1.0">
24    <meta http-equiv="X-UA-Compatible" content="ie=edge">
25    <title>Document</title>
26    <script src="js/vue.min.js"></script>
27</head>
28<body>
29    <div id="app">
30        <div>{{ num }}</div>
31        <button v-on:click="num+= 1">按钮</button>
32        <!-- 如果有参数必须加() -->
33        <button @click="fnAdd()">按钮调用函数</button>
34    </div>
35    <script>
36        var vm = new Vue({
37            el:'#app',
38            data:{
39                num:0
40            },
41            methods:{
42                // 函数区域
43                // 函数名: 匿名函数
44                fnAdd: function(){
45                    // num自增1  this.xx  duixiang.shux
46                    this.num += 1
47                }
48            }
49        })
50    </script>
51</body>
52</html>

7.事件冒泡

事件冒泡是浏览器的DOM树问题,vue也有事件冒泡。

vue阻止事件冒泡的方法,在事件属性后面加stop属性@事件属性.stop

vue阻止表单提交:在事件属性后面加.prevent=""

工作中有人可能使用的是@submit.stop.prevent=""

1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7    <title>Document</title>
 8    <style>
 9        .father{
10            width: 200px;
11            height: 200px;
12            background: green;
13        }
14        .son{
15            width: 100px;
16            height: 100px;
17            background: pink;
18        }
19    </style>
20    <script src="js/vue.min.js"></script>
21</head>
22<body>
23    <div id="app">
24        <div class="father" v-on:click="fnAdd">
25            <!-- vue阻止事件冒泡:在事件属性后面加stop属性 -->
26            <div class="son" @click.stop.prevent="fnAdd">{{ num }}</div>
27             <!-- @submit.prevent="" -->
28        </div>
29    </div>
30    <script>
31        var vm = new Vue({
32            el:'#app',
33            data:{
34                num: 1
35            },
36            methods:{
37                fnAdd: function(){
38                    vm.num ++ 
39                }
40            }
41        })
42    </script>
43</body>
44</html>


相关文章
|
5月前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
54 0
|
18天前
|
移动开发 前端开发 JavaScript
js之ajax |12-6
js之ajax |12-6
|
3月前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第3天】前端开发中的异步基石:AJAX与Fetch。AJAX,使用XMLHttpRequest,处理跨域、回调地狱和错误处理。Fetch,基于Promise,简化请求,但需注意默认无跨域头和HTTP错误处理。两者各有优劣,理解其问题与解决策略,能提升前端应用的性能和用户体验。
107 24
|
2月前
|
JavaScript 前端开发 网络协议
|
2月前
|
JavaScript 前端开发 安全
js之AJAX
js之AJAX
25 0
|
4月前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
|
3月前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第9天】JavaScript进阶:AJAX与Fetch API对比。AJAX用于异步数据交换,XMLHttpRequest API复杂,依赖回调。Fetch API是现代、基于Promise的解决方案,简化请求处理。示例:`fetch(&#39;url&#39;).then(r =&gt; r.json()).then(data =&gt; console.log(data)).catch(err =&gt; console.error(err))`。注意点包括检查HTTP状态、错误处理、CORS、Cookie和超时。Fetch提高了异步代码的可读性,但需留意潜在问题。
84 0
|
3月前
|
前端开发 JavaScript API
js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)
js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)
43 0
|
4月前
|
XML 移动开发 前端开发
JS设置Ajax为同步或异步
JS设置Ajax为同步或异步
38 0
|
4月前
|
XML JSON 前端开发
第十一篇JavaScript JSON与AJAX
第十一篇JavaScript JSON与AJAX
28 0