这是一个用Vue、Bootstrap和PHP一起写的小实例,回顾总结了一下之前学习的知识,顺带添加点学习乐趣。
先上效果图:


用到的知识有:Vue数据绑定及组件、Bootstrap界面、PHP-AJAX交互、MySQL存储,其他细节的就不说了。
建立的文件有三个:一个HTML文件(Vue.html,js内嵌在HTML中)、两个PHP文件(getData.php、addData.php)。
首先构建前端界面:

1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8">
5 <title>测试HTML</title>
6 <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet">
7 <link href="https://cdn.bootcss.com/tether/1.3.6/css/tether.min.css" rel="stylesheet">
8 <style type="text/css">
9 #app-1{
10 width: 50%;
11 margin:auto;
12 margin-top: 6%;
13 }
14 .btn{
15 cursor: pointer;
16 }
17 </style>
18 </head>
19 <body>
20 <div id="app-1">
21 <table class="table table-hover table-bordered table-condensed">
22 <thead>
23 <tr>
24 <td style="width: 30%">姓名</td><td style="width: 30%">年龄</td><td style="width: 20%">性别</td><td style="width: 20%">删除</td>
25 </tr>
26 </thead>
27 <tbody>
28 <tr is="table-row" v-for="item in ar" :details="item"></tr>
29 <tr>
30 <td>
31 <input type="text" class="form-control" v-model="name">
32 </td>
33 <td>
34 <input type="number" class="form-control" v-model="age">
35 </td>
36 <td>
37 <select class="form-control" v-model="gender">
38 <option selected="selected" value="男">男</option>
39 <option value="女">女</option>
40 </select>
41 </td>
42 <td>
43 <button class="btn btn-sm btn-warning" @click="addData">添加</button>
44 </td>
45 </tr>
46 </tbody>
47 </table>
48 </div>
49 <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
50 <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
51 <script src="https://cdn.bootcss.com/tether/1.3.6/js/tether.min.js"></script>
52 <script src="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
53 <script type="text/javascript">
54 var templateStr = '<tr><td>{{details.name}}</td><td>{{details.age}}</td><td>{{details.gender}}</td><td><button class="btn btn-danger btn-sm" :value="details.name" @click="delData">删除</button></td></tr>';
55 var app1 = new Vue({
56 el:'#app-1',
57 data:{
58 ar:[{name:'钟德鸣',age:21,gender:'male'}],
59 name:'',
60 age:'',
61 gender:'男'
62 },
63 methods:{
64 addData:function(){
65 var addObj = {};
66 addObj.name = this.name;
67 addObj.age = this.age;
68 addObj.gender = this.gender;
69 $.ajax({
70 url:'addData.php',
71 type:'POST',
72 data:addObj,
73 // dataType:'json',
74 success:function(response){
75 if (response == "1") {
76 alert("添加成功!");
77 }
78 else{
79 alert("添加失败!");
80 }
81 window.location.reload();
82 },
83 error:function(){
84 alert('failed!');
85 }
86 });
87 }
88 },
89 components:{
90 'tableRow':{
91 template:templateStr,
92 props:['details'],
93 methods:{
94 delData:function(){
95 var name = event.target.value;
96 var delStr = 'name=' + name;
97 $.ajax({
98 url:'getData.php',
99 type:'POST',
100 data:delStr,
101 success:function(response){
102 if(response == '1'){
103 alert('删除成功!');
104 window.location.reload();
105 }
106 else{
107 alert('删除失败!');
108 window.location.reload();
109 }
110 },
111 error:function(){
112 alert('请求失败!');
113 }
114 });
115 }
116 }
117 }
118 }
119 });
120 var getData = function(){
121 $.ajax({
122 url:'getData.php',
123 type:'GET',
124 data:{},
125 dataType:'json',
126 success:function(response){
127 if(response == 'failed'){
128 alert('Get Data Failed!');
129 }
130 if(typeof response === 'string'){
131 response = JSON.parse(response);
132 }
133 app1.ar = response;
134 },
135 error:function(){
136 alert('Failed!');
137 }
138 });
139 };
140 $(function(){
141 getData();
142 });
143 </script>
144 </body>
145 </html>
不要忘记应用一些必要的包。
其中有一些需要注意的地方:
(1)在table中插入Vue组件作为tr,不能直接写组件名称。如果直接将<table-row>写在table标签中,会被认为是无效的内容,引起渲染错误。解决方法是使用is属性解决。
(2)table-row标签中使用的details属性,需要现在组件中声明,否则Vue会报错“property details is not defined...”,注意在components中声明属性时,props是一个数组,不能直接用字符串声明。
(3)我的组件是声明在Vue实例中的,所以是一个局部注册组件,只能在指定的作用域内使用。注册时的格式不同于全局注册时的格式,需要注意一下。局部注册时,components是作为参数对象的一个属性,但是components本身就是一个对象。
(4)注意到在声明组件的字符串模板中,为删除按钮绑定的事件不是声明在Vue实例中,而是在components对象属性中。原因是删除按钮的事件是子组件的事件不是父组件的事件;如果声明在Vue实例中,那么只有<table-row>之外$('#app-1')之内的标签可以使用。如果难以理解,请往下看(6)。
(5)table-row标签下的tr是定义添加行的代码。添加行中的表单控件的值通过v-model这个语法糖绑定在Vue示例的data属性中。当它们的值发生变化时,app1对象的data属性也会发生变化。
(6)注意到button控件中,也绑定了一个点击事件,看一下点击事件的事件函数在哪定义呢,根据(4)中的结论,应该定义在Vue实例中。事实就是如此,addData方法定义在Vue示例的methods属性中。而(4)中的delData函数必须定义在components对象属性中。区别就在于delData是子组件的事件函数,而addData是父组件的事件函数。
(7)addData函数通过ajax向后台传送数据,这里直接传输了一个对象,PHP后台接受数据的方式与接受表单数据方式一致。不过表单中控件的name对应了传输的对象的属性。这里如果直接传输json数据,会导致在PHP后台无法通过$_POST[]方式接受数据。
(8)看到删除按钮的事件函数delData,由于只需要传输一个name参数(MySQL数据表中的主键),所以没有用对象方式传递参数,而是用一个字符串,这样传递数据,在PHP后台也是可以获取的。
(9)关于选择框绑定数据:
单选列表:
在select标签中指定v-model,v-model会将选中的option的value传递给data,如果没有指定value则默认value即为选项内容。
多选列表:
data中的数据为一个数组,v-model指向这个数组。
下面是PHP代码:
(1)getData.php
1 <?php
2 $conn = mysqli_connect('localhost','root','***********','person');
3 if(!empty($_POST['name'])){
4 $delStr = "delete from information where name = '" . $_POST['name'] ."';";
5 $result = mysqli_query($conn,$delStr);
6 if($result === true){
7 echo '1';
8 }
9 else{
10 echo '0';
11 }
12 }
13 else{
14 if($conn){
15 $result = mysqli_query($conn,'select *from information');
16 if(mysqli_num_rows($result)>0){
17 $array = array();
18 while ($row = mysqli_fetch_array($result)) {
19 array_push($array, $row);
20 }
21 echo json_encode($array);
22 }
23 else{
24 echo "failed";
25 }
26 }
27 }
28 ?>
(2)addData.php
1 <?php
2 if(!empty($_POST['name'])){
3 $conn = mysqli_connect('localhost','root','***********','person');
4 if($conn){
5 $insertStr = "insert into information(name,age,gender) values ('".$_POST['name']."','".$_POST['age']."','".$_POST['gender']."');";
6 $result = mysqli_query($conn,$insertStr);
7 if($result){
8 echo "1";
9 }
10 else{
11 echo "0";
12 }
13 }
14 }
15 ?>
其中也有一些需要注意的地方:
(1)在查询表数据时,利用mysqli_query()函数返回的结果,使用mysqli_num_rows可以获取查询结果条数,可以用于判断是否有查询到结果,使用mysqli_fetch_array可以把结果按数组形式返回。
(2)addData在添加数据时,注意在构造插入字符串时,PHP使用“.”运算符连接字符串而不是“+”号,写完js代码之后再写PHP代码容易混淆,曾经一度导致没有插入数据。
这个小实例主要是运用了一下新学习的Vue知识,顺便回顾了一下PHP知识和Bootstrap知识。球员数据并不真实,属于随意捏造哦。
最后上一张数据库数据的图,以说明数据已经真实的添加到数据库中:

来源:https://www.cnblogs.com/DM428/p/7067366.html
