Vue -- 总结 03

计算属性

<template>
  <div id="app">
    <h1>计算属性</h1>
    <!-- <div>{{ message.split('').reverse().join('') }}</div>
    <div>{{ message }}</div> -->
    <h1>方法的调用</h1>
    <div>{{ reversedMessageFun() }}</div>
    <div>{{ reversedMessageFun() }}</div>
    <div>{{ reversedMessageFun() }}</div>
    <div>{{ reversedMessageFun() }}</div>
    <input type="text" v-model="message">
    <h3>计算属性的缓存</h3>
    <div>{{ num }}</div>
    <input type="text" v-model="num">
    <div>{{ salePrice }}</div>
  </div>
</template>

<script>

// 一个.vue文件就是一个组件,组件的选项
// 你可以在一个组件的选项中定义本地的过滤器:局部过滤器
// vue2选项式API--代码应该写在什么地方给你规定好了
export default {
  name:'App',
  data(){
    return{
      message:'hello',
      num:123,
      // reversedMessage:""
    }
  },
  methods:{
    reversedMessageFun: function(){
      return this.message.split('').reverse().join('')
    }
  },
  // 计算属性
  computed:{
    // 简化模版中重复使用的复杂表达式
    // 计算属性的 getter
    // 计算属性中的方法名当成data中字段去使用
    // 计算属性中的方法名不能和data中已有的字段进行重复
    reversedMessage(){
      return this.massage.split('').reverse().join('')
    },
    salePrice(){
      return this.num*3
    }
  }
}
</script>

<style>

</style>

过滤器

        过滤器就是一个函数, 传入值返回处理后的值

        过滤器可以用在两个地方:双花括号插值和v-bind表达式。

        过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示 |

        过滤器不改变真正的data,而只是改变渲染的结果,并返回过滤后的版本

        全局注册时是filter,没有s的。而局部过滤器是filters,是有s的

全局定义字母都大写的过滤器

局部定义字符串翻转的过滤器

<template>
  <div>
    <p>原来的样子: {{ msg }}</p>
    <!-- 2. 过滤器使用
      语法: {{ 值 | 过滤器名字 }}
     -->
    <p>使用翻转过滤器: {{ msg | reverse }}</p>
    <p :title="msg | toUp">鼠标长停</p>
  </div>
</template>

<script>
export default {
  data(){
    return {
      msg: 'HelloVue'
    }
  },
  // 方式2: 局部 - 过滤器
  // 只能在当前vue文件内使用
  /*
     语法: 
     filters: {
       过滤器名字 (val) {
         return 处理后的值
       }
     }
  */
  filters: {
    toUp (val) {
      return val.toUpperCase()
    }
  }
}
</script>

<style>

</style>

过滤器和就地更新 

<template>
    <div id="app">
      <h1>就地更新</h1>
        <div v-for="(item,index) in arr" :key="index">
          {{ item }}
        </div>
        <button @click="changeArr(1)">修改arr</button>
        <h1>高效更新</h1>
        <div v-for="item in arrObj" :key="item.id">
            {{ item.name }}
            <div v-for="item in item.children" :key="item.id">
                {{ item.name }}
            </div>
        </div>
        <button @click="changeArr(2)">修改arr</button>
        <h3>直接修改数组</h3>
        <button @click="changeArr(3)">直接修改数组</button>
        <h1>过滤器的使用</h1>

        <!-- | 管道需要放到js遇到的后面 -->
        <!-- 可被用于一些常见的文本格式化 -->
        <!-- 数据格式化 -->
        <div>{{ message | capitalize('$') }}</div>
        <!-- <div>{{ message | stan('$') }}</div> -->
        <h1>时间格式化</h1>
        <div>{{ timeDate | formTime }}</div>
    </div>
  </template>
  
  <script>
  import moment from "moment";
//   一个.vue文件就是一个组件,组件的选项
// 你可以在一个组件的选项中定义本地的过滤器:局部过滤器
// vue2选项式API--代码应该写在什么地方给你规定好了
    export default {
      name:'App',
      data(){
        return {
          message:'hello',
          arr:['小明','小蓝','小红'],
          arrObj:[
            {
              id:256,
              name:'小米',
              children:[
                {
                  id:258,
                  name:'红米'
                }
              ]
            },
            {
              id:123,
              name:'小明',
              children:[
                {
                  id:234,
                  name:'moom'
                }
              ]
            }
          ],
          timeDate:new Date()
        }
      },
      methods:{
        changeArr(type){
          let that = this;
          if(type==1){
            // 就地更新 (如果没有使用key或者key是下标时会触发就地更新(就地修改))
            that.arr.splice(1,0,'添加的值')
          }else if(type==2){
            // 高效更新(如果key是id会触发高效更新)
            that.arrObj.splice(1,0,{id:999,name:'小小'})
          }else{
            // vm.$set( target(要修改的目标), propertyName/index(要修改的属性or下标), value(设置的新值) )
            // that.arr[0]='新值' 错误的写法
            console.log('this',this);
            that.$set(that.arr,0,'新值')
          }
        }
      },
      filters:{
        capitalize(value,money)  {
          // if(!value) return '' 的意思是,如果 value 的布尔值为 false
          //(即 value 为 undefined、null、0、空字符串 ""、false 等),
          // 则执行 return '' 语句,返回一个空字符串。
          if(!value) return ''
          // 转换成字符串
          let value1 = value.toString()
          console.log('value',value);
          console.log('value.slice(1)',value.slice(1));
          console.log('value1',value1.charAt(0).toUpperCase());
          return value1.charAt(0).toUpperCase() + value1.slice(1)+money
        },
        formTime(value){
          return moment(value).format('YYY年MM月DD日HH:mm:ss')
        }
      }
    }
  </script>

侦听器的基本使用

<template>
  <div id="app">
    <h1>侦听器--简单数据类型</h1>
    <input type="text" v-model="studentName">
    <div>{{ classMsg }}</div>
    <div>{{ schoolMsg }}</div>
    <h1>侦听复杂数据类型</h1>
    <input type="text" v-model="obj.name">
  </div>
</template>

<script>
// 一个.vue文件就是一个组件,组件的选项
// 你可以在一个组件的选项中定义本地的过滤器:局部过滤器
// vue2选项式API--代码应该写在什么地方给你规定好了
export default {
  name: 'App',
  data(){
    return {
      studentName:"小明",
      classMsg:"999",
      schoolMsg:"郑州100",
      obj:{
        name:"san"
      }

    }
  },
  methods:{
    
  },
  watch:{
    // 侦听器一般是一个值的变化影响多个值的变化
    // 一对多的关系
    studentName(newValue,oldValue){
      console.log("newValue",newValue)
      console.log("oldValue",oldValue)
      let that = this;
      that.classMsg = `火花256${newValue}`
      that.schoolMsg = `五道口火花256${newValue}`
    },
    // 侦听复杂数据类型其中一种写法
    // "obj.name"(newValue,oldValue){
    //   console.log("newValue",newValue)
    //   console.log("oldValue",oldValue)
    // }
    // 使用使用侦听来侦听对象
    deepCopy:{
      handler(newValue,oldValue){
        console.log("newValue",newValue)
        console.log("oldValue",oldValue)
      },
      // 深度侦听
      deep:true,
      // 立即执行
      immediate:true
    }
  }, 
  // 计算属性
  computed:{
    // 
    // 简化模版中重复使用的复杂表达式
    // 计算属性的 getter
    // 计算属性中的方法名当成data中字段去使用
    // 计算属性中的方法名不能和data中已有的字段进行重复
    reversedMessage(){
      return this.message.split('').reverse().join('')
    },
    deepCopy(){
      return JSON.parse(JSON.stringify(this.obj))
    },
    salePrice(){
      // 计算公式 公式里面是不是会有多个影响的因素
      // 多个值的变化影响一个值的变化
      // 多对一的关系
      // 
        return this.num*2+99
    }
  }
 
}
</script>

<style>

</style>

computed(计算属性)和watch(侦听器)有什么区别 

computed:

        computed 计算属性通过属性计算而得来的属性,使模板更加简洁,易于维护,

        computed 中的函数必须用return返回最终的结果,

        computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。

        computed 它不能计算在data中已经定义过的变量。

watch:

        watch监听的是你定义的变量,当你定义的变量的值发生变化时,调用对应的方法。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你遇到的错误信息"'素材\day03\code\05-脚手架相关代码\vue-demo1\node_modules\.bin\' 不是内部或外部命令,也不是可运行的程序 或批处理文件。internal/modules/cjs/loader.js:883 throw err;"通常是由于无法找到或执行指定的命令导致的。根据你提供的引用内容,我可以看出这个错误可能与你的项目目录和配置有关。 首先,你引用的中的文件说明提供了项目的结构,其中包括了`node_modules`文件夹。这个文件夹是由vue-cli创建的一个基于webpack的vue.js项目的一部分。它包含了项目所需的所有依赖模块。 其次,你引用的中提到,`node_modules`文件夹是为vue.js项目而创建的,并且是基于webpack的。 根据这些信息,我可以推断你遇到的错误可能是由于无法找到或执行`'素材\day03\code\05-脚手架相关代码\vue-demo1\node_modules\.bin\'`这个路径下的命令导致的。 为了解决这个问题,你可以尝试以下几个步骤: 1. 确保你处于正确的项目目录下,即`'素材\day03\code\05-脚手架相关代码\vue-demo1\'`。你可以使用`cd`命令切换到正确的目录。 2. 检查一下你的项目是否完整,包括所有的依赖模块是否正确安装。你可以运行`npm install`命令来安装项目所需的依赖。如果你已经安装了依赖,可以尝试删除`node_modules`文件夹并重新运行`npm install`来重新安装依赖。 3. 确保你已经正确设置了项目的运行环境和配置。在运行项目之前,你可能需要先进行一些配置工作,比如设置API代理等。你可以参考中提到的关于启动本地开发服务器和API代理的文档来进行配置。 总结起来,你遇到的错误可能是由于找不到或执行指定的命令导致的。你可以尝试按照上述步骤检查和解决问题。希望这些信息能对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)...](https://blog.csdn.net/weixin_30312563/article/details/96063042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vue安装过程及环境配置](https://blog.csdn.net/cjw12581/article/details/125294362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值