08-vue(路由传值,filter数据过滤器,watch监听器,静默刷新)

01-路由传值:

当我们进行路由跳转时,时常是需要带一些参数过去的

main.js文件:
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false
// 导入子组件
import one from './components/one.vue'
import two from './components/two.vue'

// 1.安装导入路由插件vue-router
import VueRouter from 'vue-router'
// 2.全局注册
Vue.use(VueRouter);

// 解决在one页面还点one页面的报错(百度找)
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}

// 3.实例化与配置
const router = new VueRouter({
  routes: [{
      path: '/',
      component: one
    },
    {
      path: '/one',
      component: one
    },
    {
      path: '/two',
      component: two
    }
  ]

});
// 4.挂载到new Vue
// 5.路由出口

new Vue({
  render: h => h(App),
  router
  // router:router,前面是固定写死的必要要是router,后面的一个router是实例化那个
}).$mount('#app')


App.vue(主组件):
<template>
  <div>
    <!-- 传值 -->
    <button @click="gotoView('/one?id=22')">点我进入one页面</button>
    <button @click="gotoView2">点我进入two页面</button>
    <!-- 5.路由出口 -->
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  methods: {
    // 路由传值有两种方式:
    // 1.第一种传值:直接拼接在url上,在路由后面写 ,例如这里'/one?id=22'
    gotoView(str) {
      // 这句代码就是说去到/#/one?id=2这个路由的组件(页面)去
       this.$router.push(str);

      // 解决在one页面又点one页面的报错方法,这种方法要每个跳转路由的都去这样写很麻烦
      // 可以直接写在main.js里面(百度找)
      // this.$router.push(str).catch((err)=>{
      //   return err
      // });
    

    },
    // 2.第二种传值:配置传值,通过query
    gotoView2() {
      this.$router.push({
        path: "/two",
        query: {
          userName: "tangyali"
        }
      });
    }
  }
};
// 传过去的值怎么接收呢?在路由页面this.$route.query.传值键
</script>

<style>
</style>
one.vue(主子组件):
<template>
  <div>我是one页面</div>
</template>

<script>
export default {
  name: "one",
  data() {
    return {
      msg: "我是one页面"
    };
  },
  created() {
    console.log(this.$route.query.id);//22
  }
};
</script>

<style>
</style>
two.vue(子组件):
<template>
  <div>我是two页面</div>
</template>

<script>
export default {
  name: "two",
  data() {
    return {
      msg: "我是two页面"
    };
  },
  created() {
    console.log(this.$route.query.userName);//tangyali
  }
};
</script>

<style>
</style>

效果说明: 点击不同的button进入不同的路由,不同的路由分别展示不同的组件,
可以通过路由后面传值给不同的组件
传参有两种:
    1:配制写法
             this. $ router.push({
             path:“路径xxx”,
             query:{
             //这里的query就好比在url上串了一些参;数,类似于接口get请求传参
               userName:“xxx”
             }
             })
    2:路径拼接写法,类似于get请求
     this.$router.push(“路径?userName=xxx”),

接受传递的参数:(是在路由跳转到xxx组件后,在xxx组件里面接收):
     this. $ route.query.name
     //这里就可以收到this.$router.push传递过来的参数了 ,在相应组件接收参数
在这里插入图片描述
在这里插入图片描述

02-filter过滤器:

有的时候,有些数据没法直接拿来用,就需要对这些数据进行加工处理,过滤器就是用来做这个功能的

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>filter过滤器</title>
</head>

<body>
    <!-- 
        过滤器的基本使用:
            使用场景:给他一个或者多个值(通过参数给),他会加工返回一个新的值
            定义在filters:{}里面,本质就是一个function,return回来的一个值
            function 过滤器名字(参数名){
                return 值;
            }
            使用它:{{参数名 | 过滤器方法名}}
            它目前只能用在插值语法和v-bind里面
            他不能使用this

        计算属性: 
            使用场景: 依赖一个或者多个值产生一个新的值,依赖的值发生了改变,计算属性的值也会改变
            他是可以使用this的. 
            定义在computed:{}里面
            本质也是一个函数,直接当做属性来使用. 
     -->


    <div id='app'>
        {{arr | fileterArr}}
        <!-- 用filter过滤器处理完之后,页面上就是过滤之后的:波波&清理 -->
        <p>{{computeArr}}</p>
        <!-- 用computed属性 把arr数组处理之后的,页面上就是处理之后的:波波❤清理-->
    </div>

    <script src='./vue.js'></script>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                arr: [{ name: '波波', age: 19 }, { name: '清理', age: 19 }]
            },
            // 过滤器们都写在这里
            filters: {
                //写一个过滤器
                // fileterArr(arr) {
                //     // 把arr的里面每一项的名字取出来返回
                //     let arrNew = []
                //    for(let i = 0;i < arr.length;i++) {
                //        arrNew.push(arr[i].name)
                //    }
                //    return arrNew.join('❤')
                // },

                fileterArr(arr) {
                    let arrNew = arr.map((item) => {
                        return item.name
                    })
                    return arrNew.join('&')
                }
            },
            // 计算属性们都写在这里
            computed: {
                computeArr(){
                    let arrNew = this.arr.map((item)=>{
                        return item.name;
                    });
                    return arrNew.join('❤')
                }
            },


        });
    </script>
</body>

</html>

效果说明:

  • 全局过滤器 ( 全局过滤器定义后,所有组件都可使用)

    • 定义(在main.js中做全局定义)

      • //value是过滤器的要过滤的值,这里return的值就是最终过滤器的值 
        Vue.filter("过滤器名字",function(value){
          return  返回值        
        })
        
    • 使用

      • //这里的value就是过滤器方法里面的参数,也就是要过滤的值
        <div class="time">{{value | 过滤器名字 }}</div>
        
  • 局部过滤器(只能应用于当前组件)上面那个demo就是用的局部的

    • 定义(在自己所在组件里面定义)

      • //上面的value是过滤器的要过滤的值,return的值就是过滤器定义的结果
        filters: {
            过滤器名字(value) {
              return 返回值 
            }
          }
        
        
    • 使用

    • //这里的value就是过滤器方法里面的参数,也就是要过滤的值
      <div class="time">{{value | 过滤器名字 }}</div>
      

    作用: 平时项目中用的较多的,就是对一些字符串加工之类的,如:接口传了你一个时间戳,你需要转换成相应的正常时间格式等。

03-watch监听器:

watch:可以侦听某个数据是否发生变化,如果发生变化会立刻调用相关函数

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>watch监听器</title>
</head>
<!-- watch监听器
作用:监听某个数据,如果这个数据发生了改变,就会立马响应
定义:在watch()中
他的本质也是一个function
他的方法名有一些特殊:a.首先找到你要监听的数据
                   b.去掉this
                   c.加一个引号
    这个监听器有两个参数:一个是变了之后的新数据,一个是老数据(基本不用)
   调用:自动触发,只要监听的数据发生了改变就会触发
 -->

<body>
    <div id='app'>
        <button @click="update">点我变数据</button>
        <p>{{num}}</p>
    </div>

    <script src='./vue.js'></script>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                num: 100
            },
            methods: {
                update() {
                    this.num = Math.random() * 888
                },
                testsb() {
                    alert('嘻嘻')
                }
            },
            // 监听器们
            watch: {
                "num"(newValue, oldValue) {
                    // console.log(newValue, oldValue); //一个是变了之后的新数据,一个是老数据
                    // console.log(this.num); //这样也可以拿到新数据
                   //只要num发生改变就调用这个函数
                    this.testsb();

                }
            },
        });
    </script>
</body>

</html>

效果说明: 只要num发生改变就会被监听到,就会在触发 “数据名”:function(newVal,oldVal){}

在这里插入图片描述

04-静默刷新:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>静默刷新</title>
</head>
<!-- 
无法显示更新后数据的原因
vue无法监控复合型数据的每一项. 
    解决方法:1.静默刷新 
             2.$set
-->
<body>
    <div id='app'>
        <button @click="change">点我变</button>
        <ul>
            <li v-for="(item, index) in list" :key="index" v-if="isShow">{{item}}</li>
        </ul>
    </div>

    <script src='./vue.js'></script>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                isShow: true,
                list: [1, 2, 3, 4, 5]
            },
            methods: {
                change() {
                    // 静默刷新
                    this.list[1] = Math.random() * 999
                     this.isShow=false
                     //这种是定时器在vue中的高级写法
                    this.$nextTick(()=>{
                        this.isShow=true
                    });
                    // 修改用$set来改
                    this.$set(this.list,1,Math.random() * 999)
                }
            }
        });
    </script>
</body>

</html>

效果说明:
本来点击按钮执行里面的change方法是不会使得该数组list的下标为1的改成随机数的,
因为这个数组是复合型数据,vue无法监控复合型数据的每一项
但是此时又想让这个数组的某一项变化可以使用静默刷新,
先让li用vi-f渲染出来,随后更改数据之后,就不渲染了再利用
this$nextTick( ()=>{
把他又渲染出来,此时数据已经改变,再渲染就是改变之后的数据
) ,
第二种方法就是用 $ set(该数组,要改变的下标,改成什么)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值