1.计算属性

https://cn.vuejs.org/v2/guide/computed.html

  1. new Vue({
  2. computed:{//定义
  3. show(){
  4. }
  5. }
  6. })
++计算属性1.html:++
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. window.onload = function(){
  9. let vm = new Vue({
  10. el:"#app",
  11. data:{
  12. msg:"abc",
  13. msg2:"msg2"
  14. },
  15. methods:{//没有缓存
  16. reverse(){
  17. console.log("methods");
  18. return this.msg.split("").reverse().join("")
  19. }
  20. },
  21. computed:{//有缓存
  22. reverse2(){//只关心自己
  23. console.log("computed");
  24. return this.msg.split("").reverse().join("")
  25. }
  26. }
  27. });
  28. };
  29. </script>
  30. </head>
  31. <body>
  32. <div id="app">
  33. <input v-model="msg" type="text" value=""/><br />
  34. <input v-model="msg2" type="text" value=""/><br />
  35. {{msg2}}<br />
  36. {{msg}}<br />
  37. {{reverse()}}<br />
  38. {{reverse2}}<br />
  39. </div>
  40. </body>
  41. </html>

res:

只要data中的内容改变,methods就运行,computed只有与其相关的data发生变化才运行.



++计算属性2.html:(get,set)++
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. //计算属性的名字不出出现在 data/methods中 会有冲突
  9. window.onload = function(){
  10. vm = new Vue({
  11. el:"#app",
  12. data:{
  13. msg:"abc",
  14. },
  15. computed:{
  16. /*reverse(){// get
  17. return this.msg.split("").reverse().join("")
  18. } */
  19. reverse:{
  20. get(){
  21. return this.msg.split("").reverse().join("")
  22. },
  23. set(value){
  24. console.log("set:",value);
  25. this.msg = value;
  26. }
  27. }
  28. }
  29. });
  30. };
  31. </script>
  32. </head>
  33. <body>
  34. <div id="app">
  35. <input v-model="msg" type="text" value=""/><br />
  36. <input v-model="reverse" type="text" value=""/><br />
  37. {{msg}}<br />
  38. {{reverse}}<br />
  39. </div>
  40. </body>
  41. </html>

res:

使用

{{show}}

注意事项:

1、名字:data/methods里面不能出现, 会有冲突

2、计算属性可以修改 前提条件—— 必须有set

3、方法可以调用计算属性 计算属性页可以调用方法

4、计算属性必须有返回值 使用的时候不带括号!

  1. show(){}
  2. show:{
  3. get(){},
  4. set(value){...}
  5. }
++计算属性3.html:++

方法调用计算属性 计算属性页可以调用方法;

计算属性必须有返回值 使用的时候不带括号!

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. //方法调用计算属性 计算属性页可以调用方法
  9. window.onload = function(){
  10. vm = new Vue({
  11. el:"#app",
  12. data:{
  13. a:12,
  14. b:5
  15. },
  16. methods:{
  17. sum(){
  18. return this.sum2;
  19. //return this.sum2();//不能带括号
  20. }
  21. },
  22. computed:{
  23. sum2(){
  24. return parseInt(this.a) + parseInt(this.b);
  25. }
  26. }
  27. });
  28. };
  29. </script>
  30. </head>
  31. <body>
  32. <div id="app">
  33. <input v-model="a" type="text" value=""/><br />
  34. <input v-model="b" type="text" value=""/><br />
  35. {{sum()}}<br />
  36. {{sum2}}<br />
  37. </div>
  38. </body>
  39. </html>

res:


2.监听 watch

  1. let vm = new Vue({
  2. watch:{
  3. wd(){},
  4. wd:"方法名 show",
  5. wd:[fn1,fn2....],
  6. ["json.wd"](){}
  7. json:{
  8. handler: function (val, oldVal) { /* ... */ },
  9. deep: true//深度监听
  10. immediate: true//立即执行
  11. },
  12. }
  13. });

vm.$watch

https://cn.vuejs.org/v2/api/#vm-watch

++监听1.html:++
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script src="vue-resource.js"></script>
  8. <script>
  9. window.onload = function(){
  10. let url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su";
  11. let vm = new Vue({
  12. el:"#app",
  13. data:{
  14. wd:"abc",
  15. arr:[1,2,3]
  16. },
  17. methods:{
  18. show(){
  19. console.log("methods");
  20. this.$http.jsonp(url,{params:{wd:this.wd},jsonp:"cb"}).then(res=>{
  21. this.arr = res.data.s;
  22. });
  23. }
  24. },
  25. watch:{
  26. /*wd(){
  27. this.show();
  28. } */
  29. wd:"show"
  30. }
  31. });
  32. };
  33. </script>
  34. </head>
  35. <body>
  36. <div id="app">
  37. <input v-model="wd" type="text" value=""/><br />
  38. <ul>
  39. <li v-for="item in arr">{{item}}</li>
  40. </ul>
  41. </div>
  42. </body>
  43. </html>

res:

++监听2.html:++
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script src="vue-resource.js"></script>
  8. <script>
  9. window.onload = function(){
  10. let url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su";
  11. let vm = new Vue({
  12. el:"#app",
  13. data:{
  14. json:{wd:"abc"},
  15. arr:[1,2,3]
  16. },
  17. methods:{
  18. show(){
  19. console.log("methods");
  20. this.$http.jsonp(url,{params:{wd:this.json.wd},jsonp:"cb"}).then(res=>{
  21. this.arr = res.data.s;
  22. });
  23. }
  24. },
  25. watch:{
  26. /* ["json.wd"](){
  27. this.show();
  28. }, */
  29. //深度监听
  30. json:{
  31. handler: function () {
  32. this.show();
  33. },
  34. deep: true,
  35. immediate: true
  36. },
  37. }
  38. });
  39. };
  40. </script>
  41. </head>
  42. <body>
  43. <div id="app">
  44. <input v-model="json.wd" type="text" value=""/><br />
  45. <ul>
  46. <li v-for="item in arr">{{item}}</li>
  47. </ul>
  48. </div>
  49. </body>
  50. </html>

res:


3.组件:模板 template 标签

全局组件、局部组件

全局组件

Vue.component("组件的名称、标签名",选项);

选项 options

{template:<div>内容</div>}

exp:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. //全局组件
  9. //Vue.component(组件名称,选项);
  10. Vue.component("mycomponent",{
  11. template:`<div>全局组件</div>`
  12. });
  13. window.onload = function(){
  14. let vm = new Vue({
  15. el:"#app",
  16. });
  17. };
  18. </script>
  19. </head>
  20. <body>
  21. <div id="app">
  22. <mycomponent></mycomponent>
  23. <div is="mycomponent"></div>
  24. <component is="mycomponent"></component>
  25. </div>
  26. </body>
  27. </html>

局部组件

  1. new Vue({
  2. components:{
  3. 组件的名称、标签名:选项
  4. }
  5. })

exp:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. window.onload = function(){
  9. let vm = new Vue({
  10. el:"#app",
  11. components:{
  12. mycomponent:{
  13. template:`<div>局部组件</div>`
  14. }
  15. }
  16. });
  17. };
  18. </script>
  19. </head>
  20. <body>
  21. <div id="app">
  22. <mycomponent></mycomponent>
  23. </div>
  24. </body>
  25. </html>
显示三种:
  1. <组件的名称></组件的名称>
  2. <div is="组件的名称"></div>
  3. <component is="组件的名称"></component>

注意事项:

1、组件必须定义在vue实例化之前

2、推荐使用双标签 单标签慎用,最好不要使用单标签

3、模板里面只能有一个父元素,不能有兄弟节点

组件的命名规范:

Component names can only contain alphanumeric characters and the hyphen,

and must start with a letter.

组件名称只能包含【字母】【数字】和【连字符】,并且必须以字母开头。

1、不能使用中文

2、不能使用系统html里面已经存在的标签名

3、连字符: 中横线和下划线

4、驼峰标识 优先级 my-componen > myComponen > MyComponent,

页面上使用: ++++

组件可以循环 :必须带上key---> ++:key="id"++

  1. Vue.component("mycomponent",{
  2. template:`<div>mycomponent组件</div>`
  3. });
  4. <mycomponent v-for="item in 3" :key="item"></mycomponent>

is:规范标签的写法!
  1. <ul>
  2. <li>li</li>
  3. <div>div</div>
  4. <p>p</p>
  5. </ul>
  6. <table>
  7. <tbody>
  8. <tr><td> tr--->td</td></tr>
  9. /*tr标签为空,div和p标签在table上面*/
  10. <tr><div>div</div></tr>
  11. <tr><p>p</p></tr>
  12. </tbody>
  13. </table>
  14. Vue.component("mytr",{
  15. template:`<tr><td> tr--->td</td></tr>`
  16. });
  17. <table>
  18. <tbody>
  19. <mytr></mytr>错误写法
  20. <tr is="mytr"></tr>正确的写法
  21. </tbody>
  22. </table>

组件通信:vuex

1、父传子 props :子组件的属性="父组件的data"

//通信是单向的 父组件到子组件,子传父自定义事件

2、子传父 this.$emit(自定义事件,数据);

@自定义事件="父组件的函数名"

子组件,data必须是一个函数

props里面的属性不能出现在data中 反之亦然

exp:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. //通信是单向的 父组件到子组件
  9. Vue.component("mycomponent",{
  10. props:["msg"],
  11. template:`<div>子组件:<input v-model="wd" @input="show" type="text" value=""/>
  12. {{msg}}------{{wd}}
  13. </div>`,
  14. data(){
  15. return {
  16. wd:this.msg
  17. }
  18. },
  19. methods:{
  20. show(){
  21. //this.msg = this.wd;
  22. //console.log(this.wd);
  23. this.$emit("abc",this.wd);
  24. }
  25. }
  26. });
  27. window.onload = function(){
  28. let vm = new Vue({
  29. el:"#app",
  30. data:{
  31. msg:"abc"
  32. },
  33. methods:{
  34. fn(data){
  35. console.log("fn:",data);
  36. this.msg = data;
  37. }
  38. }
  39. });
  40. };
  41. </script>
  42. </head>
  43. <body>
  44. <div id="app">
  45. 父组件:<input v-model="msg" type="text" value=""/> {{msg}}
  46. <hr />
  47. <mycomponent :msg="msg" @abc="fn"></mycomponent>
  48. </div>
  49. </body>
  50. </html>

res:

父传子:



子传父:


props命名规则

1、props:["props-name"] {{propsName}} :props-name="xxxx"

2、props:["props_name"] {{props_name}} :props_name="xxxx"

3、props:["propsName"] {{propsName}} :props-name="xxxx"

4、props:["PropsName"] {{PropsName}} :props-name="xxxx"

5、props:["AAA"] {{AAA}} :a-a-a="xxxx"

exp:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. Vue.component("mycomponent",{
  9. props:["AAA"],
  10. template:`<div>组件{{AAA}}</div>`,//不能是中划线
  11. });
  12. window.onload = function(){
  13. let vm = new Vue({
  14. el:"#app",
  15. data:{
  16. msg:"Vue msg"+Math.random()
  17. }
  18. });
  19. };
  20. </script>
  21. </head>
  22. <body>
  23. <div id="app">
  24. <mycomponent :a-a-a="msg"></mycomponent>
  25. </div>
  26. </body>
  27. </html>

案例

组件通信:
1、自增:
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script>
  8. //this.$emit(sEv,data)
  9. Vue.component("mycomponent",{
  10. props:["count"],
  11. template:`<div><input @click="handleClick" type="button" value="点我"> {{count}}</div>`,
  12. methods:{
  13. handleClick(){
  14. //this.count++;
  15. this.$emit("plus",this.count+1);
  16. }
  17. }
  18. });
  19. window.onload = function(){
  20. let vm = new Vue({
  21. el:"#app",
  22. data:{
  23. count:0
  24. },
  25. methods:{
  26. add(data){
  27. console.log(1111,data);
  28. this.count = data;
  29. }
  30. }
  31. });
  32. };
  33. </script>
  34. </head>
  35. <body>
  36. <div id="app">
  37. {{count}}
  38. <hr />
  39. <mycomponent :count="count" @plus="add"></mycomponent>
  40. </div>
  41. </body>
  42. </html>

res:

2、百度下拉索引
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script src="vue-resource.js"></script>
  8. <script>
  9. Vue.component("baidu-input",{
  10. template:`<input v-model="wd" type="text" value=""/>`,
  11. data(){
  12. return {wd:""}
  13. },
  14. watch:{
  15. wd(){
  16. this.$emit("jsonp",this.wd);
  17. }
  18. }
  19. });
  20. Vue.component("baidu-list",{
  21. props:["arr"],
  22. template:`
  23. <ul>
  24. <li v-for="item in arr">{{item}}</li>
  25. </ul>`,
  26. });
  27. window.onload = function(){
  28. let url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su";
  29. let vm = new Vue({
  30. el:"#app",
  31. data:{
  32. arr:[],
  33. },
  34. methods:{
  35. baiduJsonp(wd){
  36. this.$http.jsonp(url,{params:{wd},jsonp:"cb"}).then(res=>{
  37. this.arr = res.data.s;
  38. });
  39. }
  40. }
  41. });
  42. };
  43. </script>
  44. </head>
  45. <body>
  46. <div id="app">
  47. <baidu-input @jsonp="baiduJsonp"></baidu-input>
  48. <baidu-list :arr="arr"></baidu-list>
  49. </div>
  50. </body>
  51. </html>

res:

3、选项卡

方法一:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script src="vue-resource.js"></script>
  8. <style>
  9. input.active{background:pink;}
  10. </style>
  11. <script>
  12. Vue.component("tab",{
  13. template:`
  14. <div>
  15. <input @click="tab(index)"
  16. :class="{active:iNow==index}"
  17. v-for="item,index in title"
  18. type="button" :value="item"/>
  19. <div>{{content[iNow]}}</div>
  20. </div>
  21. `,
  22. data(){
  23. return {
  24. iNow:0,
  25. title:["aaa","bbb","ccc"],
  26. content:["aaa","bbb","ccc"],
  27. }
  28. },
  29. methods:{
  30. tab(index){
  31. this.iNow = index;
  32. }
  33. }
  34. });
  35. window.onload = function(){
  36. let vm = new Vue({
  37. el:"#app",
  38. });
  39. };
  40. </script>
  41. </head>
  42. <body>
  43. <div id="app">
  44. <tab></tab>
  45. </div>
  46. </body>
  47. </html>

方法二:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. <script src="vue.js"></script>
  7. <script src="vue-resource.js"></script>
  8. <style>
  9. input.active{background:pink;}
  10. </style>
  11. <script>
  12. Vue.component("tab",{
  13. props:["iNow","title","content"],
  14. template:`
  15. <div>
  16. <input @click="tab(index)"
  17. :class="{active:iNow==index}"
  18. v-for="item,index in title"
  19. type="button" :value="item"/>
  20. <div>{{content[iNow]}}</div>
  21. </div>
  22. `,
  23. methods:{
  24. tab(index){
  25. this.$emit("abc",index);
  26. }
  27. }
  28. });
  29. window.onload = function(){
  30. let vm = new Vue({
  31. el:"#app",
  32. data:{
  33. iNow:0,
  34. title:["aaa","bbb","ccc"],
  35. content:["aaa","bbb","ccc"],
  36. },
  37. methods:{
  38. tab(index){
  39. this.iNow = index;
  40. }
  41. }
  42. });
  43. };
  44. </script>
  45. </head>
  46. <body>
  47. <div id="app">
  48. <tab :i-now="iNow" :title="title" :content="content" @abc="tab"></tab>
  49. </div>
  50. </body>
  51. </html>

res:

12.vue属性.监听.组件的更多相关文章

  1. vue属性监听

    1.watch:用来监听每一个属性的变化 2.watch这个对象里面都是函数,函数的名称是data中的属性名称,watch中的函数不需要调用 3.当属性发生改变那么就会触发watch函数,每个函数都会 ...

  2. vue的属性监听

    一.vue的监听 1.监听的例子 如: html:<input type="number" v-model="a" /> js: watch: { ...

  3. Vue中如何监听组件的原生事件

    在首页开发中,右下角有一个返回顶部的小箭头,将它单独封装成一个BackTop组件,但是它何时出现需要依赖于首页的滑动,即另外一个Scroll组件.如果直接在BackTop组件里面监听,则需要通过thi ...

  4. Vue 变量,成员,属性监听

    Vue变量 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF ...

  5. Vue之计算属性Computed和属性监听Watch,Computed和Watch的区别

    一. 计算属性(computed) 1.计算属性是为了模板中的表达式简洁,易维护,符合用于简单运算的设计初衷. 例如: <div id="app"> {{ myname ...

  6. 9.Vue.js 监听属性

    本章节,我们将为大家介绍 Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化. 以下实例通过使用 watch 实现计数器: <div id = "app&q ...

  7. Vue.js之计算属性(computed)、属性监听(watch)与方法选项(methods)

    vue.js官网:https://cn.vuejs.org/v2/guide/components-registration.html 一.计算属性-computed 1. 作用:能够避免数据冗余,通 ...

  8. vue对象属性监听

    对象属性监听的两种方法: 1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValu ...

  9. 设计模式(5): vue 不监听绑定的变量

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 绑定变量 一般情况下,如果我们需要在组件中使用某个变量,会这么使用: ...

随机推荐

  1. JavaWeb中过滤器Filter的使用示例

    https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter 过滤器示例基于以下流程 测试效果如下 web.xml配 ...

  2. centos7安装redis设置开机启动

    1. 首先下载redis源码,并使用tar进行解压缩 wget http://download.redis.io/releases/redis-4.0.8.tar.gztar xvzf redis-4 ...

  3. android:第十章,后台的默默劳动者——服务,学习笔记

    一.多线程 1)本章首先介绍了安卓的多线程编程,说明在子线程中如果要修改UI,必须通过Handler, Message, MessageQueue, Looper来实现,但是这样毕竟太麻烦了.  2) ...

  4. solr集群构建的基本流程介绍

    先从第一台solr服务器说起:1. 它首先启动一个嵌入式的Zookeeper服务器,作为集群状态信息的管理者,2. 将自己这个节点注册到/node_states/目录下3. 同时将自己注册到/live ...

  5. HOWTO: Avizo/Amira使用前的显卡设置(Volume Rendering,Volren不显示)

    关于Avizo或Amira中体渲染不显示的问题,常常有人在问,有人甚至怀疑软件有问题,今天就这个话题总结如下: 首先我们要清楚像Avizo或Amira之类的三维可视化软件,必须是在配有专业显卡的工作站 ...

  6. Java操作Linuxshell并且获取返回值

    /** * */package com.king.weixin.util;import java.io.BufferedReader;import java.io.InputStream;/*** @ ...

  7. cookie 跨域解决方法

    1.Nginx 正向和反向代理的区别 正向代理和反向代理的区别:正向代理隐藏真实客户端,反向代理隐藏真实服务端,图示: 2.cookie跨域问题 因为cookie存在跨域问题,其中一个解决方法是,设置 ...

  8. 每天一个linux命令:free

    1.命令简介 free (free) 命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer. 2.用法 free [-b | -k | -m | -g | -h ...

  9. 使用插件扩展Docker

    http://wwwbuild.net/dockerone/241249.html   Docker吸引我的,同时也是促使其成功的一个重要方面,是其开箱即用的特性. “开箱即用”是指什么呢?简单来说, ...

  10. ssh的用户配置文件config管理ssh会话

    抄的这个: https://www.cnblogs.com/zhonghuasong/p/7236989.html 只是在这里留个存档,防止删除 我有这样的需求就是,因为需要ssh连接到服务器,然后每 ...