一 vue.js的M-V-VM思想

MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式。

  1.Model指代的就是vue对象的data属性里面的数据。这里的数据要显示到页面中。

  2.View指代的就是vue中数据要显示的HTML页面,在vue中,也称之为“视图模板” 。

  3.ViewModel指代的是vue.js中我们编写代码时的vm对象了,它是vue.js的核心

    负责连接 View 和 Model,保证视图和数据的一致性,所以前面代码中,data里面的数据被显示中p标签中就是vm对象自动完成的。

二.大致的用法

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="js/vue.min.js"></script>
  7. <script>
  8. window.onload = function(){
  9. // 创建vm对象
  10. var vm = new Vue({
  11. el: "#app",
  12. data: {
  13. name:"大标题",
  14. age:16,
  15. },
  16. })
  17. }
  18. </script>
  19. </head>
  20. <body>
  21. <div id="app">
  22. <!-- 在双标签中显示数据要通过{{ }}来完成 -->
  23. <h1>{{name}}</h1>
  24. <p>{{age}}</p>
  25. <!-- 在表单输入框中显示数据要使用v-model来完成 -->
  26. <input type="text" v-model="name">
  27. </div>
  28. </body>
  29. </html>

1. 如果要输出data里面的数据作为普通标签的内容,需要使用{{ }}

2. 使用v-model把data里面的数据显示到表单元素以后,一旦用户修改表单元素的值

   则data里面对应数据的值也会随之发生改变,甚至,页面中凡是使用了这个数据都会发生变化。

3. 双花括号仅用输出文本内容,如果要输出html代码,则不能使用这个.要使用v-html来输出.

  v-html必须在html标签里面作为属性写出来.

  1. <span v-html="img"></span>
  2. <script>
  3. let vm = new Vue({
  4. el:".app",
  5. data:{
  6. img:'<img src="data:images/shendan.png">',
  7. }
  8. })
  9. </script>

4.在输出内容到普通标签的使用{{ }}还支持js代码。

  <h1>{{str1.split("").reverse().join("")}}</h1>

5. 支持js的运算符
  <h1>{{num1+3}}</h1>

6.三元运算符,类似于python里面的三元表达式
  三元运算符的语法:
    判断条件 ? 条件为true : 条件为false的结果

    <h1>num1和num2之间进行比较,最大值:{{ num2>num1?num2:num1 }}</h1>

  python 三元表达式[三目运算符]的语法:
    a if 条件 else b
7 .图片标签

  1. <span v-html="img"></span>
  2. <img :src="img2" alt="" width="200px"> <!-- 冒号:表示 设置属性 -->
  3.  
  4. data:{ // data 相当于 model
  5. img:'<img src="img/1.png" width="100px">' ,// 数据为标签时,在页面展示时需要放在一个标签中显示设置v-html 属性
  6. img2:'img/1.png' , //用设置属性的方法 :src='img2'
  7. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7. </head>
  8. <body>
  9.  
  10. <div id="app">
  11. <span v-html="img"></span>
  12. <img :src="img2" alt="" width="200px"> <!-- 冒号:表示 设置属性 -->
  13. <img v-bind:src="img2" width="50"> <!--1.0版本用 v-bind: 设置属性-->
  14. </div>
  15.  
  16. <script>
  17. // 页面加载完执行
  18. window.onload=function (ev) {
  19.  
  20. let vm = new Vue({
  21. // 至少两个数据el 和data
  22. el:'#app', //通过css 选择器 确定vue要控制的范围
  23. data:{ // data 相当于 model
  24. img:'<img src="img/1.png" width="100px">' ,// 数据为标签时,在页面展示时需要放在一个标签中显示设置v-html 属性
  25. img2:'img/1.png' , //用设置属性的方法 :src='img2'
  26. }
  27.  
  28. })
  29.  
  30. }
  31. </script>
  32.  
  33. </body>
  34. </html>

图片标签

常用指令

1.指令 (Directives) 是带有“v-”前缀的特殊属性。每一个指令在vue中都有固定的作用。

  在vue中,提供了很多指令,常用的有:v-if、v-model、v-for等等。

  指令会在vm对象的data属性的数据发生变化时,会同时改变元素中的其控制的内容或属性。

vue1.x写法                  ------>      vue2.x的写法
  v-html                    ------>      {{ }}
  v-bind:属性名        ---->         :属性                表示: 设置属性
  v-on:事件名         ---->     @事件名

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7. </head>
  8. <body>
  9.  
  10. <div id="app">
  11. <span v-html="img"></span>
  12. <p v-html="{{title}}"></p>
  13. <img v-bind:src="img2" width="50"> <!--1.0版本用 v-bind: 设置属性-->
  14. <button v-on:click="func">点击</button> <!-- 点击事件 -->
  15. <button @click="(num<10)?(num):(num-10)">点击{{num}}</button> <!-- 点击事件 使用了三元运算符 -->
  16. </div>
  17.  
  18. <script>
  19. // 页面加载完执行
  20. window.onload=function (ev) {
  21.  
  22. let vm = new Vue({
  23. // 至少两个数据el 和data
  24. el:'#app', //通过css 选择器 确定vue要控制的范围
  25. data:{ // data 相当于 model
  26. img:'<img src="img/1.png" width="100px">' ,// 数据为标签时,在页面展示时需要放在一个标签中显示设置v-html 属性
  27. title:"hello world",
  28. num:10
  29. },
  30. methods:{
  31. func:function () {
  32. alert("你点我干嘛!");
  33. }
  34. }
  35.  
  36. })
  37.  
  38. }
  39. </script>
  40.  
  41. </body>
  42. </html>

2. 操作属性

格式:

<标签名 :标签属性="data属性"></标签名>

  1. <p :title="str1">{{ str1 }}</p> <!-- 也可以使用v-html显示双标签的内容,{{ }} 是简写
  2. <a :href="url2">淘宝</a>
  3. <a v-bind:href="url1">百度</a> <!-- v-bind是vue1.x版本的写法 -->

3.事件绑定

有两种写法,@事件名 和 v-on:事件名

<button v-on:click="num++">按钮</button> <!-- v-on 是vue1.x版本的写法 -->
<button @click="num+=5">按钮2</button>

1. 使用@事件名来进行事件的绑定
语法:
<h1 @click="num++">{{num}}</h1>

2. 绑定的事件的事件名,全部都是js的事件名:
  @submit ---> onsubmit
  @focus ---> onfocus

案例1 :

  知识点:

    1.  v-model     input 框

    2. @click  点击事件

    3. 三元运算符

核心代码:

  1. <button @click="num+=1">添加商品</button>
  2. <input type="text" v-model="num">
  3. <button @click="(num<=1)?(num=1):(num-=1)">减少商品</button> <!--三元运算 -->
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7. </head>
  8. <body>
  9. <script>
  10. // 页面加载完执行
  11. window.onload=function (ev) {
  12.  
  13. let vm = new Vue({
  14. // 至少两个数据el 和data
  15. el:'#app', //通过css 选择器 确定vue要控制的范围
  16. data:{ // data 相当于 model
  17. num:10
  18. }
  19.  
  20. })
  21.  
  22. }
  23. </script>
  24. <div id="app">
  25.  
  26. <button @click="num+=1">添加商品</button>
  27. <input type="text" v-model="num">
  28. <button @click="(num<=1)?(num=1):(num-=1)">减少商品</button> <!--三元运算 -->
  29. </div>
  30.  
  31. </body>
  32. </html>

商品增减

4 操作样式

1.控制标签class类名

格式:
<h1 :class="值">元素</h1> 值可以是对象、对象名、数组

添加class类名,值是一个对象

  1.  
  1. <style>
    .box1{color: red;border: 1px solid #000;}
    .box2{background-color: orange;font-size: 32px;}
    </style>
  1. <!---直接给标签设置class属性时,用的是 单花括号 -->
  2. <p :class="{box1:mycls1}">段落一</p>
  3. <p @click="mycls3=!mycls3" :class="{box2:mycls3,box1:mycls2,}">段落一</p>
  4.  
  5. data:{ // data 相当于 model
  6. mycls1:false, // class属性设置是 bool
  7. mycls2:true,
  8. mycls3:true
  9. }

{
class类1:布尔值变量1,
class类2:布尔值变量2,
}

2. 一个属性间的来回切换

  1. <style>
  2. .box4{
  3. background-color: red;
  4. }
  5. .box5{
  6. color: green;
  7. }
  8. </style>
  9. <div id="app2">
  10. <!---通过点击事件来回的切换样式 ->
  11. <!---给某个标签来回切换样式 点击事件,对样式进行取反 ,再给某个标签设置该样式就可以来回切换该样式 -->
  12. <button @click="mycls.box5=!mycls.box5">改变背景</button>
  13. <button @click="mycls.box4=!mycls.box4">改变字体颜色</button> <!--mycls3=!mycls3 表示取反 ,用于来回在该属性之间进行切换-->
  14. <p :class="mycls">你好啊</p>
  15. </div>
  16. <script>
  17. let vm2=new Vue({
  18. el:"#app2",
  19. data:{
  20.  
  21. mycls:{
  22. box4:false,
  23. box5:true
  24. }
  25. }
  26. })
  27. </script>

3. 批量给元素增加多个class样式类

  1. <style>
  2. .box4{
  3. background-color: red;
  4. }
  5. .box5{
  6. color: green;
  7. }
  8. </style>
  9.  
  10. <!-- 批量给元素增加多个class样式类 -->
  11. <style>
  12. .box6{background-color: red;}
  13. .box7{color: green;}
  14. .box8{border: 1px solid yellow;}
  15. </style>
  16.  
  17. <div id="app3">
  18. <p :class="[mycls1,mycls2]">第3段落</p>
  19. </div>
  20. <script>
  21. let vm3=new Vue({
  22. el:"#app3",
  23. data:{
  24.  
  25. mycls1:{
  26. box6:false,
  27. box7:true
  28. },
  29. mycls2:{
  30. box8:true
  31. }
  32. }
  33. })
  34. </script>

 2  控制标签style样式

格式1:值是json对象,对象写在元素的:style属性中

  1. <div :style="{color: activeColor, fontSize: fontSize + 'px' }"></div>
  2.  
  3. data: {
  4. activeColor: 'red',
  5. fontSize: 30
  6. }

格式2:值是对象变量名,对象在data中进行声明

  1. <div v-bind:style="styleObject"></div>
  2.  
  3. data: {
  4. styleObject: {
  5. color: 'red',
  6. fontSize: '13px'
  7. }
  8. }

格式3:值是数组

  1. <div v-bind:style="[style1, style2]"></div>
  2.  
  3. data: {
  4. style1:{
  5. color:"red"
  6. },
  7. style2:{
  8. background:"yellow",
  9. fontSize: "21px"
  10. }
  11. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7. <style>
  8. .box1{color: red;border: 1px solid #000;}
  9. .box2{background-color: orange;font-size: 32px;}
  10. </style>
  11. </head>
  12. <body>
  13.  
  14. <!--方式一-->
  15. <div id="box1">
  16. <p :style="{color:mycolor,backgroundColor:mybg}">第一段内容</p>
  17.  
  18. </div>
  19.  
  20. <br>
  21. <script>
  22.  
  23. var vm1= new Vue({
  24. el:"#box1",
  25. data:{
  26. mycolor:'red',
  27. mybg:'pink'
  28. }
  29. })
  30.  
  31. </script>
  32.  
  33. <!--方式二-->
  34. <div id="box2">
  35. <p :style="mystyle">第一段内容</p>
  36.  
  37. </div>
  38.  
  39. <br>
  40. <script>
  41.  
  42. var vm2= new Vue({
  43. el:"#box2",
  44. data:{
  45. mystyle:{
  46. color:"red",
  47. backgroundColor:"pink"
  48. }
  49. }
  50. })
  51.  
  52. </script>
  53.  
  54. <!--方式三:-->
  55. <div id="box3">
  56. <div :style="[mystyle,mystyle2]">第一段内容</div>
  57.  
  58. </div>
  59.  
  60. <br>
  61. <script>
  62. var vm3= new Vue({
  63. el:"#box3",
  64. data:{
  65. mystyle:{
  66. color:"red",
  67. backgroundColor:"pink"
  68. },
  69. mystyle2:{
  70. height:"400px",
  71. width:"400px"
  72. }
  73.  
  74. }
  75. })
  76.  
  77. </script>

例子

3  条件渲染指令

vue中提供了两个指令可以用于判断是否要显示元素,分别是v-if和v-show。

   1. v-if

  1. <!-- vue对象最终会把条件的结果变成布尔值 -->
  2. <h1 v-if="ok">Yes</h1>
  3. data:{
  4. ok:false // true则是显示,false是该标签不会出现,不只是隐藏
  5. }

2 v-else

v-else指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

  1. <h1 v-if="ok">Yes</h1>
  2. <h1 v-else>No</h1>
  3.  
  4. data:{
  5. ok:false // true则是显示,false是隐藏
  6. }

3 v-else-if

  1. <h1 v-if="num==1">num的值为1</h1>
  2. <h1 v-else-if="num==2">num的值为2</h1>
  3. <h1 v-else>num的值是{{num}}</h1>
  4.  
  5. data:{
  6. num:2
  7. }

4 v-show

用法和v-if大致一样,区别在于2点:

1. v-show后面不能v-else
2. v-show隐藏元素时,使用的是display:none来隐藏的,

  而v-if是直接从HTML文档中移除元素[ DOM操作中的remove ]

  1. <h1 v-show="ok">Hello!</h1>
  2. data数据:
  3. data:{
  4. ok:false // true则是显示,false是隐藏

案例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7.  
  8. </head>
  9. <body>
  10. <div id="box">
  11. <p v-if="is_login">欢迎再次登录我们网站</p>
  12. <p v-else><a href="">注册</a><a href="">登录</a></p>
  13.  
  14. <p v-if="num%3==0">这个数能被3整除</p>
  15. <p v-else-if="num%5==0">这个数能被5整除</p>
  16. <p v-else-if="num==1">这个数为{{num}}</p>
  17. <p v-else>你好</p>
  18. <!--v-show 符合条件就展示 ,不符合条件就隐藏 -->
  19. <p v-show="num==3">这个数为3</p>
  20. <p v-show="num">这个数为3</p>
  21. </div>
  22.  
  23. </body>
  24.  
  25. <script>
  26. var vm =new Vue({
  27. el:'#box',
  28. data:{
  29. // is_login:true,
  30. is_login:false,
  31. num:3
  32. }
  33.  
  34. })
  35. </script>
  36. </html>

v-if v-else v-show

5 列表渲染指令

在vue中,可以通过v-for指令可以将一组数据渲染到页面中,数据可以是数组或者对象。

数据是数组:

  1. <ul>
  2. <!--i是列表的每一个元素-->
  3. <li v-for="i in list">{{i}}</li>
  4. </ul>

数据是对象:

  1. <ul>
  2. <!--i是每一个value值,j是每一个键名-->
  3. <li v-for="(i, j) in obj1">{{j}}:{{i}}</li>
  4. </ul>

实用案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7. </head>
  8. <body>
  9. <script>
  10. // 页面加载完执行
  11. window.onload=function (ev) {
  12.  
  13. let vm = new Vue({
  14. // 至少两个数据el 和data
  15. el:'#app', //通过css 选择器 确定vue要控制的范围
  16. data:{ // data 相当于 model
  17. num:10
  18. }
  19.  
  20. })
  21.  
  22. }
  23. </script>
  24. <div id="app">
  25.  
  26. <button @click="num+=1">添加商品</button>
  27. <input type="text" v-model="num">
  28. <button @click="(num<=1)?(num=1):(num-=1)">减少商品</button> <!--三元运算 -->
  29. </div>
  30.  
  31. </body>
  32. </html>

商品增减

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="vue.js"></script>
  7. <style>
  8.  
  9. span{
  10. height: 100px;
  11. width: 100px;
  12. background: grey;
  13. display: inline-block;
  14. line-height: 100px;
  15. text-align: center;
  16. }
  17. .new div{
  18. width: 320px;
  19. height: 300px;
  20. background: red;
  21. display: none;
  22. }
  23. .new .active{
  24. display: block;
  25. }
  26. .current{
  27. background: red;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div id="box">
  33. <div class='item'>
  34. <span :class="num==1?'current':''" @click="num=1">国内新闻</span>
  35. <span :class="num==2?'current':''" @click="num=2">国外新闻</span>
  36. <span :class="num==3?'current':''" @click="num=3">银河新闻</span>
  37. </div>
  38. <div class="new" >
  39. <div :class="num==1?'active':''">国内新闻</div>
  40. <div :class="num==2?'active':''">国外新闻</div>
  41. <div :class="num==3?'active':''">银河新闻</div>
  42. </div>
  43. </div>
  44.  
  45. </body>
  46.  
  47. <script>
  48. var vm =new Vue({
  49. el:'#box',
  50. data:{
  51. num:1
  52. }
  53.  
  54. })
  55. </script>
  56. </html>

内容切换

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../vue.js"></script>
  7. <link rel="stylesheet" href="bootstrap/css/bootstrap.css">
  8. </head>
  9. <style>
  10. .active {
  11. color: red
  12. }
  13.  
  14. #good_add, #good_edit {
  15. width: 300px;
  16. height: 300px;
  17. border: 1px solid grey;
  18. background: grey;
  19. text-align: center;
  20. /*display: none;*/
  21. }
  22. .proform{
  23. display: block;
  24. }
  25. .hide_cls{
  26. display: none;
  27. }
  28. #good_edit div ,#good_add div{
  29. margin-top: 20px;
  30. }
  31.  
  32. </style>
  33. <body>
  34.  
  35. <div id="box">
  36. <div class="row">
  37. <div class="col col-md-3">
  38. <div id="good_add" :class="{'proform':add_cls1,'hide_cls':add_cls2}">
  39. <h3>添加商品</h3>
  40. <div>商品标题&nbsp;&nbsp;&nbsp;<input type="text" v-model="add_name"></div>
  41. <div>商品数量&nbsp;&nbsp;&nbsp;<input type="text" v-model="add_num"></div>
  42. <div>商品价格&nbsp;&nbsp;&nbsp;<input type="text" v-model="add_price"></div>
  43. <div><button class="btn btn-default" @click="add_keep" style="margin-right: 20px">保存</button ><button class="btn btn-default " @click="add_cancel" style="margin-left: 20px">取消</button></div>
  44.  
  45. </div>
  46. </div>
  47.  
  48. <div class="col col-md-6 ">
  49. <button class="btn btn-info" @click="add">添加</button>
  50.  
  51. <table class="table table-bordered">
  52. <tr>
  53. <th>编号</th>
  54. <th>书名</th>
  55. <th>价格</th>
  56. <th>数量</th>
  57. <th>操作</th>
  58. </tr>
  59. <tbody>
  60. <tr v-for="good,key in goods">
  61. <td>{{key+1}}</td>
  62. <td>{{good.name}}</td>
  63. <td v-if="good.price>100" :class="{active:mycls}">{{good.price}}</td>
  64. <td v-if="good.price<=100">{{good.price}}</td>
  65. <td>{{good.num}}</td>
  66. <td>
  67. <button class="btn btn-info" @click="edit(key)">编辑</button>
  68. <button class="btn btn-danger" @click="goods.splice(key,1)">删除</button>
  69. </td>
  70. </tr>
  71.  
  72. </tbody>
  73. </table>
  74. </div>
  75. <div class="col col-md-3 pull-right">
  76. <div id="good_edit" :class="{'proform':edit_cls1,'hide_cls':edit_cls2}" >
  77. <!--<div>编号<input type="text" v-model="k"></div>-->
  78. <h3>编辑商品</h3>
  79. <div>商品标题&nbsp;&nbsp;&nbsp;<input type="text" v-model="name"></div>
  80. <div>商品数量&nbsp;&nbsp;&nbsp;<input type="text" v-model="num"></div>
  81. <div>商品价格&nbsp;&nbsp;&nbsp;<input type="text" v-model="price"></div>
  82. <div><button class="btn btn-default" @click="edit_keep" style="margin-right: 20px">保存</button ><button class="btn btn-default" @click="edit_cancel" style="margin-left: 20px">取消</button></div>
  83.  
  84. </div>
  85. </div>
  86.  
  87. </div>
  88. </div>
  89.  
  90. <script>
  91. let l = new Vue({
  92.  
  93. el: "#box",
  94. data: {
  95. goods: [
  96. {'name': "python1", 'price': 150,"num":1000},
  97. {'name': "python2", 'price': 100,"num":2000},
  98. {'name': "python3", 'price': 70,"num":3000},
  99. {'name': "python4", 'price': 60,"num":4000},
  100. {'name': "python5", 'price': 110,"num":5000}
  101. ],
  102. //编辑所用的值
  103. k:"",// 记录该书的索引值,方便编辑后保存用
  104. name:"", //点击编辑时,把该书的开始name显示 ,之后修改后同步改变,下面的价格和数量也是一样
  105. price:"",
  106. num:"",
  107. edit_init_dic:"",// 点击编辑时,记录最初 的书籍信息
  108. // edit_init_k:"",//点击编辑时,记录该书最初索引值 可以不用
  109.  
  110. edit_cls1: false,
  111. edit_cls2: true,
  112.  
  113. //添加用的参数
  114. add_name:"",
  115. add_price:"",
  116. add_num:"",
  117. add_cls1:false,
  118. add_cls2:true,
  119. mycls:true
  120.  
  121. },
  122. methods:{
  123. edit:function (key) {
  124. //显示编辑框
  125. this.edit_cls1=true;
  126. this.edit_cls2=false;
  127. //数据处理
  128. this.k=key;
  129. this.name=this.goods[key].name;
  130. this.price=this.goods[key].price;
  131. this.num=this.goods[key].num;
  132. this.edit_init_dic={"name":this.goods[key].name,"price":this.goods[key].price,"num":this.goods[key].num};
  133. this.edit_init_k=key
  134. },
  135. edit_keep:function () {
  136. this.goods.splice(this.k,1,{"name":this.name,"price":this.price,'num':this.num})
  137. this.edit_cls1=false;
  138. this.edit_cls2=true;
  139. },
  140. edit_cancel:function () {
  141. this.goods.splice(this.k,1,this.edit_init_dic);
  142. this.edit_cls1=false;
  143. this.edit_cls2=true;
  144. },
  145. add:function () {
  146. //点击添加按钮弹出 添加框 //:class="{'proform':add_cls1,'hide_cls':add_cls2}
  147. this.add_cls1=true;
  148. this.add_cls2=false;
  149.  
  150. //将上次的数据清空显示
  151. this.add_name="";
  152. this.add_price="";
  153. this.add_num="";
  154.  
  155. },
  156. add_keep:function () {
  157. //保存数据
  158. this.goods.splice(this.goods.length,1,{'name':this.add_name,'price':this.add_price,'num':this.add_num});
  159. //隐藏 添加框
  160. this.add_cls1=false;
  161. this.add_cls2=true;
  162.  
  163. },
  164. add_cancel:function () {
  165. //把数据清空
  166. this.add_name="";
  167. this.add_price="";
  168. this.add_num="";
  169. //隐藏 添加框
  170. this.add_cls1=false;
  171. this.add_cls2=true;
  172.  
  173. }
  174.  
  175. }
  176. })
  177. </script>
  178.  
  179. </body>
  180. </html>

表格的增删改查

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../vue.js"></script>
  7. <style>
  8. table,tr,th,td{
  9. border: 1px solid;
  10. border-collapse: collapse;
  11. text-align: center;
  12. }
  13. table{
  14. width: 600px;
  15. margin-left: 100px;
  16. }
  17. th{
  18. padding-top: 10px;
  19. }
  20. .box{
  21. width: 300px;
  22. height: 200px;
  23. border: 1px solid;
  24. border-radius: 5px;
  25. position: fixed;
  26. margin: auto;
  27. right: 0;
  28. left: 0;
  29. top: 0;
  30. bottom: 0;
  31. }
  32. .box div{
  33. text-align: center;
  34. margin: 15px;
  35. }
  36. .box button{
  37. margin: 20px;
  38. }
  39. table button{
  40. margin-left: 10px;
  41. }
  42. </style>
  43. </head>
  44. <div id="app">
  45. <body>
  46. <div><button @click="is_show=true">添加商品</button></div>
  47. <table>
  48. <tr>
  49. <th>商品编号</th>
  50. <th>商品名称</th>
  51. <th>商品价格</th>
  52. <th>商品数量</th>
  53. <th>操作</th>
  54. </tr>
  55. <tbody>
  56. <tr v-for="good,key in goods">
  57. <td>{{key+1}}</td>
  58. <td>{{good.name}}</td>
  59. <td>{{good.price}}</td>
  60. <td>{{good.num}}</td>
  61. <td><button @click="edit(key)">编辑</button><button @click="del(key)">删除</button></td>
  62. </tr>
  63. </tbody>
  64. </table>
  65. <div class="box" v-show="is_show">
  66. <div>商品名称:<input type="text" v-model="name"></div>
  67. <div>商品价格:<input type="text" v-model="price"></div>
  68. <div>商品数量:<input type="text" v-model="num"></div>
  69.  
  70. <div><button @click="keep" >保存</button><button @click="cancel">取消</button></div>
  71. </div>
  72.  
  73. </body>
  74. </div>
  75.  
  76. <script>
  77. var vm = new Vue({
  78.  
  79. el:"#app",
  80.  
  81. data:{
  82. edit_key:'',
  83. name:'',
  84. price:'',
  85. num:'',
  86. is_show:false,
  87. goods: [
  88. {'name': "python1", 'price': 150,"num":1000},
  89. {'name': "python2", 'price': 100,"num":2000},
  90. {'name': "python3", 'price': 70,"num":3000},
  91. {'name': "python4", 'price': 60,"num":4000},
  92. {'name': "python5", 'price': 110,"num":5000}]
  93. },
  94. methods:{
  95. //删除
  96. del:function (key) {
  97. this.goods.splice(key,1);
  98.  
  99. },
  100. // 保存
  101. keep:function () {
  102. // box 隐藏
  103. this.is_show=false;
  104. // 数据追加到后面
  105. if (this.edit_key){
  106. //编辑时保存
  107. this.goods[this.edit_key].name=this.name;
  108. this.goods[this.edit_key].price=this.price;
  109. this.goods[this.edit_key].num=this.num;
  110.  
  111. }else {
  112. this.goods.push({"name":this.name,"price":this.price,"num":this.num});
  113. }
  114. //清空 数据
  115. this.name="";
  116. this.price="";
  117. this.num="";
  118. this.edit_key='';
  119. },
  120. cancel:function () {
  121. //添加时取消
  122. this.is_show=false;
  123. //清空 数据
  124. this.name="";
  125. this.price="";
  126. this.num="";
  127. this.edit_key='';
  128.  
  129. },
  130. //编辑
  131. edit:function (key) {
  132. //显示box
  133. this.edit_key=key;
  134. this.is_show=true;
  135. //将数据显示
  136. this.name=this.goods[key].name;
  137. this.price=this.goods[key].price;
  138. this.num=this.goods[key].num;
  139.  
  140. }
  141.  
  142. }
  143. })
  144.  
  145. </script>
  146. </html>

表格增删查改优化版

vue 基础(一)的更多相关文章

  1. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  2. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十九║Vue基础: 样式动态绑定+生命周期

    回顾 哈喽大家好,前后端分离系列文章又开始了,今天周一,还是感谢大家花时间来观看我写的博客,周末呢,没有写文章,但是也没有闲着,主要是研究了下遗留问题,看过之前文章的应该知道,之前的在AOP使用Red ...

  3. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明

    缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...

  4. python 全栈开发,Day89(sorted面试题,Pycharm配置支持vue语法,Vue基础语法,小清单练习)

    一.sorted面试题 面试题: [11, 33, 4, 2, 11, 4, 9, 2] 去重并保持原来的顺序 答案1: list1 = [11, 33, 4, 2, 11, 4, 9, 2] ret ...

  5. Vue 基础精讲

    Vue 基础精讲 Vue 官方文档:https://cn.vuejs.org/v2/guide/ VUE 实例 每个组件都是一个 vue 的实例. 一个 vue 项目是由实例组成的. vue 实例上有 ...

  6. Vue基础以及指令

    Vue 基础篇一   一.Vue框架介绍 之前大家学过HTML,CSS,JS,JQuery,Bootstrap,现在我们要学一个新的框架Vue~ Vue是一个构建数据驱动的web界面的渐进式框架. 目 ...

  7. 2-5 vue基础语法

    一.vue基础语法 语法: {{msg}} html赋值: v-html="" 绑定属性: v-bind:id="" 使用表达式: {{ok? "ye ...

  8. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  9. vue基础知识之vue-resource/axios

    Vue基础知识之vue-resource和axios(三)   vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...

  10. Vue基础及脚手架环境搭建

    From:http://www.jianshu.com/p/dc5057e7ad0d 一.vue基础 “Vue2.0”跟俺一起全面入坑 01 “Vue2.0”跟俺一起全面入坑 02 “Vue2.0”跟 ...

随机推荐

  1. MongoDB 创建索引及其他

    索引 以提升查询速度 测试:插入十万条数据到数据库中 for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})} db.t1.fin ...

  2. CodeChef - ELHIDARR Find an element in hidden array(互动题)题解

    题意:有一串不递减的串,串中的任意元素都有k个,除了一个元素,他只有1 <= n < k-1个,你现在能向oj做出以下操作: 输出:1 pos,oj会返回pos位置的元素值 输出:2 va ...

  3. FAQ Flyway

    https://flywaydb.org/documentation/faq What is the best strategy for dealing with hot fixes? You hav ...

  4. OpenWRT路由器使用ipv6拨号上网教程

    文章来源于群友,如有侵权,请联系我(aha971030@gmail.com)删除 原理介绍分析: 湖北E信地区可以使用ipv6拨号,好处是网络是上下对等不限速网络,也就是说,你的端口上限是多少,网上就 ...

  5. P2163 [SHOI2007]园丁的烦恼(cdq分治)

    思路 其实是cdq的板子 题目要求询问对于每个给出的xi,yi,xj,yj形如xi<=x<=xj.yi<=y<=yj的x,y对数有多少组 改成四个询问,拆成四个前缀和的形式后就 ...

  6. 文件IO(2)

    Lseek:       ***************************************************************************    实验一:     ...

  7. Google advertiser api开发概述——最佳做法&建议

    最佳做法 本指南介绍了一些最佳做法,您可以运用它们来优化 AdWords API 应用的效率和性能. 日常维护 为确保您的应用不间断运行,可采取以下做法: 确保 AdWords API 中心中的开发者 ...

  8. [转载]grep查看上下文及简单正则表达式

    转载自:https://www.cnblogs.com/mfryf/p/3336288.html inux grep 显示前后几行的信息2016年03月02日 14:10:58 ChenHui246 ...

  9. BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...

  10. JS相关重点知识 (概况)

    1.value和innerHTML没有联系,只是value是表单的一个特有属性,而innerHTML是通用的. 2.当从外部引入js文件时,该外部文件里面可以有多个方法,   html页面中的oncl ...