zoukankan      html  css  js  c++  java
  • Vue:前后端交互、路由

    前后端交互

    Promise  >  fetch  >  axios  >  async/await

    1、Promise

    由于$.ajax()调用后端接口,要按顺序调用接口时需要在这个方法的回调函数里边调用 $.ajax(),会形成回调地狱(回调十八层地狱)。

    而 Promise的产生就是为了解决这个问题,Promise是一个异步对象,可以获取到异步操作的消息

    var p = new Promise(function(resolve,reject){
        //成功调用 resolve('数据') ,然后下面调用then就会把这个 数据 传过去
        //失败调用 reject()
    });
    p.then(function(ret){
        //从resolve获得正常结果
    },function(ret){
        //从reject获得错误信息
    });

    2、fetch: 是基于Promise实现的

    //2、fetch
    fetch('/abc').then(data=>{
        return data.text();  // 也可以 return data.json();
    }).then(ret=>{
        //这里得到最终数据
        console.log(ret);
    })

    3、axios: 一个专门用来调用api的库,也是基于Promise实现的,所以语法很相似,用这个就行

      vue里的说明文档:https://cn.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

       中文翻译文档:https://www.kancloud.cn/yunye/axios/234845

       通过 .then 获取数据,前面的几个也是通过.then

    axios.get('http://localhost:8080/nav/list').then(function(respon){
        //data属性是固定写法,通过data可以拿到后台的数据
        console.log(respon.data);
    });

       axios对返回的结果进行封装,返回的是一个对象,里边有一个data属性,里边就是借口返回的数据

     设置全局配置axios.defaults.baseURL = 'https://api.example.com';发送请求不用再打前面那些字符。 

    请求拦截器,响应拦截器,对request和对response进行处理。

    4、async / await 结合 axios 使用,可以使代码更加简洁,

      axios里边可以不用编写回调函数

            methods:{
                queryData: async function(){
                    var ret = await axios.get('访问地址');
                    console.log(ret.data);//这就相当于axios里使用回调函数访问data数据
                }
            }

     路由

    文档: https://router.vuejs.org/zh/installation.html 

    基本使用 >嵌套路由>动态路由>命名路由>编程式导航

    页面的哈希值:URL 中 # 后面的部分 https://abc.com/a/c#aaa     #aaa为哈希值

    const:

      let 声明的变量只在 let 命令所在的代码块内有效。

      const 声明一个只读的常量,一旦声明,常量的值就不能改变。

    后端路由:根据不同的URL地址,寻找相对应的资源

    前端路由:负责事件监听,触发事件后,调用不同的事件函数渲染不同的内容 

      1、router的基本使用

       html部分:

        <div id="app">
            <!-- 第1步 -->
            <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
            <!--  通过传入 `to` 属性指定链接,to会渲染成为 :href-->
            <router-link to='/rick'>to rick!!</router-link>
            <router-link to='/morty'>to morty!!</router-link>
            <!-- 第2步 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的组件将渲染在这里 -->
            <router-view></router-view>
        </div>

      js代码部分:

    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript" src="js/vue-router.js"></script>
    <script type="text/javascript" >
    //1、定义路由组件
    const Rick = {template:'<div>rick的内容</div>'};
    const Morty = {template:'<div>morty的内容</div>'};
    //2、创建router实例
    const router = new VueRouter({
        //路由规则
        routes:[
            {path:'/rick',component: Rick},
            {path:'/morty',component: Morty}
        ]
    })
    //3、将实例挂载上去
        var vm = new Vue({
            el: '#app',
            data:{
                msg:'插值表达式',
            },
            methods:{
            },
            //由于属性名和值相同,可以只写一个
            router
    
        });
    </script>

     路由重定向:添加一条路由规则, path表示当有这个hash时,重定向到 /rick

    {path:'/',redirect: '/rick'},

     2、路由嵌套

      在父路由的模板里边定义 子路由链接

    const Morty = {
        template:`
        <div>
        <div>morty的内容</div>
        <h4>子路由</h4>
        <!-- 子路由链接 -->
        <router-link to='/morty/tab1'>to rick!!</router-link>
        <router-link to='/morty/tab2'>to morty!!</router-link>
        <!-- 子路由出口 -->
        <router-view/>
        </div>
        `};

      创建子路由组件:

    //子路由
    const Tab1 = {template:'<div>子组件Tab1</div>'};
    const Tab2 = {template:'<div>子组件Tab2</div>'};

      在父路由的 路由规则里边 添加子路由 规则:

        //路由规则
        routes:[
            {path:'/',redirect: '/rick'},
            {path:'/rick',component: Rick},
            {
                path:'/morty',
                component: Morty,
                //子路由规则
                children:[
                    {path:'/morty/tab1',component:Tab1},
                    {path:'/morty/tab2',component:Tab2}
                ]
                }
        ]

     3、动态路由匹配: 类似 restful从url路径传一个id过去,

      多个路径

            <router-link to='/rick/r1'>to rick!!</router-link>
            <router-link to='/rick/r2'>to rick!!</router-link>
            <router-link to='/rick/r3'>to rick!!</router-link>

       对应一个路由规则,使用 :id

      {path:'/rick/:id',component: Rick},

       组件获取数据 ,$route.params.id

      const Rick = {template:'<div>{{$route.params.id}}星球的 rick的内容</div>'};

     4、路由传参:

      props设置为true则 $route.params 会被传到子组件,(还可以传对象)

    {path:'/',redirect: '/rick',props :true},

    5、命名路由:

    给路由起一个别名

    6、编程式导航

      声明式导航:在HTML页面中,使用 a 链接进行跳转

      编程式导航:在js里边写一个事件,通过点击HTML触发事件,进行导航。

    跳转到页面   this.$router.puth('/hash地址');

        methods:{
                handel:function(){
                    this.$router.puth('/hash地址');
                }
            },

    回退页面     this.$router.go(-1);

  • 相关阅读:
    fastjson的@JSONField注解
    Java 日期比较大小
    linux 查看文件显示行号
    Java double 加、减、乘、除
    Java 身份证判断性别获取年龄
    linux 查看端口被占用
    Unable to complete the scan for annotations for web application [/wrs] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
    nginx 返回数据不完整
    linux redis 启动 overcommit_memory
    IntelliJ IDEA 常用设置
  • 原文地址:https://www.cnblogs.com/Lemonades/p/12508071.html
Copyright © 2011-2022 走看看