Vue-Ajax核心知识整理

这篇具有很好参考价值的文章主要介绍了Vue-Ajax核心知识整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Vue框架中可以有很多方式实现 ajax, 其中有xhr、jQuery、fetch、axios、vue-resource, 其中Vue的作者尤雨溪推荐使用axios,所以在使用Vue框架时,尽量还是使用axios

但是当我们使用ajax时,经常会遇到跨域的问题,比如你本地的端口号是8080, 而服务器的端口号是5050,当你向服务器请求数据时,就会存在跨域的问题。

跨域也有很多的解决方案:

【1】cors方法:不需要前端人员操作,只需要后端人员在写服务器的时候,给你返回响应的时候,会加几个特殊的响应头;

【2】jsonp: 需要后端人员和前端人员都进行相应的操作,不常用  <script src=""></script> 只能解决 GET 请求的跨域问题,其它的请求方式解决不了。

【3】代理 proxy: 在Vue框架中经常使用

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript

因为服务器和服务器之间的数据传输并不是用的ajax,仅仅用的是http,所以不存在跨域的问题,这样本地端口向代理服务器发起请求,而代理服务器目标服务器请求,这样就解决了跨域问题。

1 配置代理服务器

在vue.config.js 中配置

  // 1. 开启代理服务器,解决跨域问题(方式一)
  devServer: {
    proxy: 'http://localhost:5000'  // 需要转发的服务器的端口
  },

  // 2.开启代理服务器(方式二)
  devServer: {
    proxy: {
      '/api': {   // /api为请求前缀,想要走代理,就在请求的地址前面加上/api,前缀可以根据需要更改
        target: '<url>',  // <url> 为请求的目标地址,比如:http://localhost:5000
        pathRewrite: {
          '^/api': ''  // 去掉请求路径中的/api
        },
        ws: true,  // 用于支持websocket
        changeOrigin: true   // 用于控制请求头中host值
      },
      // 配置多个
      '/api2': {   // /api为请求前缀,想要走代理,就在请求的地址前面加上/api,前缀可以根据需要更改
        target: '<url>',  // <url> 为请求的目标地址,比如:http://localhost:5000
        pathRewrite: {
          '^/api': ''  // 去掉请求路径中的/api
        },
        ws: true,  // 用于支持websocket
        changeOrigin: true   // 用于控制请求头中host值
      }, // 配置多个...


      // '/foo': {
      //   target: '<other_url>'
      // }
    }
  }

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript 

建议使用方式2,可以配置多个代理服务器,还有一个问题就是当请求的资源本地有时,会优先读取本地得信息,不会走代理,这样就不会读取到服务器中真实的信息。所以如果想要指定走代理的话,需要指定请求前缀

2 请求github数据案例

【List组件】

<template>
    <div class="row">
        <!-- 展示用户列表 -->
        <div class="card" v-show="info.users.length" v-for="user in info.users" :key="user.login">
            <a :href="user.html_url" target="_blank">
                <img :src="user.avatar_url" style='width: 100px'/>
            </a>
            <p class="card-text">{{user.login}}</p>
        </div>

        <!-- 展示欢迎词 -->
        <h1 v-show="info.isFirst">欢迎使用Github用户搜索</h1>


        <!-- 展示加载中 -->
        <h1 v-show="info.isLoading">加载中...</h1>


        <!-- 展示错误信息 -->
        <h1 v-show="info.errMsg">{{ info.errMsg }}</h1>

    </div>
</template>

<script>
    export default {
        name: 'List',
        data() {
            return {
                info: {
                    isFirst: true,
                    isLoading: false,
                    errMsg: '',
                    users: []
                }
            }
        },
        mounted() {
            this.$bus.$on('updateUsers', (dataObj) => {
                this.info = {...this.info, ...dataObj}  // 重名的属性以后面的为主,后面没有的就用前面的
            })
        },
    }
</script>

<style scoped>
    .album {
        min-height: 50rem; /* Can be removed; just added for demo purposes */
        padding-top: 3rem;
        padding-bottom: 3rem;
        background-color: #f7f7f7;
    }

    .card {
        float: left;
        width: 33.333%;
        padding: .75rem;
        margin-bottom: 2rem;
        border: 1px solid #efefef;
        text-align: center;
    }

    .card > img {
        margin-bottom: .75rem;
        border-radius: 100px;
    }

    .card-text {
        font-size: 85%;
    }
</style>

【Search组件】

<template>
    <div>
        <section class="jumbotron">
            <h3 class="jumbotron-heading">Search Github Users</h3>
            <div>
                <input type="text" v-model="keyWord" placeholder="enter the name you search"/>&nbsp;
                <button @click="search">Search</button>
            </div>
        </section>
    </div>
</template>

<script>
    import axios from 'axios'
    export default {
        name: 'Search',
        data() {
            return {
                keyWord: ''
            }
        },
        methods: {
            search() {
                /* 请求前更新List数据 */
                this.$bus.$emit('updateUsers', { isFirst: false, isLoading: true, errMsg: '', users: []})
                axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(
                    response => {
                        console.log('请求成功了', response.data.items)
                        /* 请求成功后更新List数据 */
                        this.$bus.$emit('updateUsers', { isLoading: false, errMsg: '', users: response.data.items})
                    },
                    error => {
                        console.log('请求失败了', error.message)
                        /* 请求失败后更新List数据 */
                        this.$bus.$emit('updateUsers', { isLoading: false, errMsg: error.message, users: []})
                    }
                )
            }
        },
    }
</script>

<style>

</style>

【App组件】

<template>

    <div class="container">
        <Search/>
        <List/>
    </div>

</template>

<script>

    import List from './components/List.vue'
    import Search from './components/Search.vue'
    export default {
        name:'App',
        components:{
            List,
            Search
        },
        
    }
</script>

3 插槽

3.1 默认插槽

【App组件】

<template>
    <div class="container">
        <Category title="美食" :listData="foods">
            <img src="./assets/imgs/girl6.jpg" alt="" id="pg1">
        </Category>

        <Category title="游戏" :listData="games">
            <ul>
                <li v-for="(item,index) in games" :key="index">{{item}}</li>
            </ul>
        </Category>
        <Category title="电影" :listData="films">
            <img src="./assets/imgs/girl3.jpg" alt="" id="pg1">
        </Category>
    </div>

</template>

<script>
    import Category from './components/Category.vue'
    export default {
        name:'App',
        components:{
            Category,
        },
        data() {
            return {
                foods:['火锅','烧烤','小龙虾','牛排'],
                games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
                films:['《教父》','《拆弹专家》','《你好,李焕英》']
            }
        },
        
    }
</script>

<style scoped>
    .container {
        display: flex;
        justify-content: space-around;

    }

        
    #pg1 {
        width: 100%;
    }

</style>

【Category组件】

<template>
  <div class="category">
    <h1>{{title}}分类</h1>
    <!-- 定义一个插槽 (默认插槽)-->
    <slot></slot>


  </div>
</template>

<script>
    export default {
        name: 'Category',
        // props: ['listData', 'title']
        props: ['title']
    }
</script>

<style>
    .category {
        margin-left: 100px;
        margin-top: 100px;;
        width: 200px;
        height: 300px;
        background-color: skyblue;
        border: 1px solid orange;
    }
    h1{
        text-align: center;
        background-color: pink;

    }


</style>

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript

3.2 具名插槽

【App组件】

<template>
    <div class="container">
        <Category title="美食" :listData="foods">
            <img slot="slot1" src="./assets/imgs/girl6.jpg" alt="" id="pg1">
            <a slot="slot2" href="http://www.baidu.com">百度</a>
        </Category>

        <Category title="游戏" :listData="games">
            <ul slot="slot1">
                <li v-for="(item,index) in games" :key="index">{{item}}</li>
            </ul>
            <a slot="slot2" href="http://www.baidu.com">百度</a>
        </Category>
        <Category title="电影" :listData="films">
            <img slot="slot1" src="./assets/imgs/girl3.jpg" alt="" id="pg1">
            <!-- <a slot="slot2" href="http://www.baidu.com">百度</a>
            <h4 slot="slot2">欢迎光临</h4> -->

            <!-- 使用 template标签这种写法时,就可以使用另一种写法 v-slot: 指定放入的插槽了 -->
            <template v-slot:slot2>
                <a href="http://www.baidu.com">百度</a>
                <h4>欢迎光临</h4>
            </template>
        </Category>
    </div>

</template>

<script>
    import Category from './components/Category.vue'
    export default {
        name:'App',
        components:{
            Category,
        },
        data() {
            return {
                foods:['火锅','烧烤','小龙虾','牛排'],
                games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
                films:['《教父》','《拆弹专家》','《你好,李焕英》']
            }
        },
        
    }
</script>

<style scoped>
    .container {
        display: flex;
        justify-content: space-around;

    }

        
    #pg1 {
        width: 100%;
    }

</style>

【Category组件】

<template>
  <div class="category">
    <h1>{{title}}分类</h1>
    <!-- 定义一个插槽 (具名插槽)-->
    <slot name="slot1">我是插槽1, 没有内容放入时,会显示</slot>
    <slot name="slot2">我是插槽1, 没有内容放入时,会显示</slot>


  </div>
</template>

<script>
    export default {
        name: 'Category',
        // props: ['listData', 'title']
        props: ['title']
    }
</script>

<style>
    .category {
        margin-left: 100px;
        margin-top: 100px;;
        width: 200px;
        height: 300px;
        background-color: skyblue;
        border: 1px solid orange;
    }
    h1{
        text-align: center;
        background-color: pink;

    }


</style>

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript

3.3 作用域插槽

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript

【Category组件】

<template>
  <div class="category">
    <h1>{{title}}分类</h1>
    <!-- 定义一个插槽 (作用域插槽)-->
    <slot :games="games" :msg="msg">我是插槽1, 没有内容放入时,会显示</slot>  
    <!-- games传递给插槽的使用者 -->

  </div>
</template>

<script>
    export default {
        name: 'Category',
        // props: ['listData', 'title']
        props: ['title'],
        data() {
            return {
                games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
                msg:'你好啊'
            }
        },
    }
</script>

<style>
    .category {
        margin-left: 100px;
        margin-top: 100px;;
        width: 200px;
        height: 300px;
        background-color: skyblue;
        border: 1px solid orange;
    }
    h1{
        text-align: center;
        background-color: pink;

    }


</style>

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript


【App组件】

<template>
    <div class="container">
        <Category title="游戏">
            <template scope="data">
                <ul>
                    <li v-for="(item,index) in data.games" :key="index">{{item}}</li>
                </ul>
            </template>
        </Category>

        <Category title="游戏">
            <!-- 解构赋值的写法 -->
            <!-- 也可以使用 slot-scope="{games, msg}" -->
            <template scope="{games, msg}">
                <ol>
                    <li v-for="(item,index) in games" :key="index" style="color:red">{{item}}</li>
                </ol>
                <h4>{{msg}}</h4>
            </template>
        </Category>

        <Category title="游戏">
            <template scope="data">
                <h3>
                    <li v-for="(item,index) in data.games" :key="index">{{item}}</li>
                </h3>
            </template>
        </Category>
    </div>

</template>

<script>
    import Category from './components/Category.vue'
    export default {
        name:'App',
        components:{
            Category,
        },  
    }
</script>

<style scoped>
    .container {
        display: flex;
        justify-content: space-around;

    }
</style>

Vue-Ajax核心知识整理,Vue,vue.js,ajax,javascript文章来源地址https://www.toymoban.com/news/detail-829336.html

到了这里,关于Vue-Ajax核心知识整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue 框架前导:详解 Ajax

    Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性,可在不刷新页面的情况下实现和服务器的通信,交换数据或者更新页面 使用 axios 库,与服务器之间进行数据通信,这

    2024年02月04日
    浏览(37)
  • javascript常见100问|前端基础知识|问ajax-fetch-axios-区别请用 XMLHttpRequestfetch 实现 ajax节流和防抖px em rem vw/箭头函数的缺点

    HTML CSS JS HTTP 等基础知识是前端面试的第一步,基础知识不过关将直接被拒。本章将通过多个面试题,讲解前端常考的基础知识面试题,同时复习一些重要的知识点。 扎实的前端基础知识,是作为前端工程师的根本。基础知识能保证最基本的使用,即招聘进来能干活,能产出

    2024年04月27日
    浏览(51)
  • Vue2学习笔记のVue中的ajax

    hello, 这篇文章是Vue2学习笔记的第四篇,也是第四章:Vue中的ajax。 vue脚手架配置代理 方法一 在vue.config.js中添加如下配置: 说明: 1 优点:配置简单,请求资源时直接发给前端(8080)即可。 2.缺点:不能配置多个代理,不能灵活的控制请求是否走代理。 3.工作方式:若按照

    2024年02月11日
    浏览(44)
  • Vue2 第十七节 Vue中的Ajax

    1.Vue脚手架配置代理 2.vue-resource 1.1 使用Ajax库 --  axios ① 安装 :  npm i axios ② 引入:   import axios from \\\'axios\\\' ③ 使用示例  1.2 解决开发环境Ajax跨域问题 跨域:违背了同源策略,同源策略规定协议名,主机名,端口号必须一致 解决方法:配置代理服务器 两种方式 方式① : (

    2024年02月13日
    浏览(58)
  • vue代码安全,10项防范措施_vue中的安全(1),架构师花费近一年时间整理出来的网络安全核心知识

    避免在模板中直接渲染用户提供的 HTML 内容,以防止跨站脚本攻击(XSS)。使用v-html时要格外小心。 data() { return { escapedHtml: this.userInput.replace(//?script/g, ‘’), }; } 3,授权和访问控制 根据用户的角色和权限来控制对页面和功能的访问。可以使用路由守卫或自定义权限验证逻辑

    2024年04月26日
    浏览(44)
  • Vue 封装ajax请求[接口]函数

             在Vue项目开发当中,当有了后端提供的数据接口之后呢,就需要来为接口定义接口的请求函数,那么在去定义接口函数之前可以先来封装一个ajax请求函数;可能有的初学者在之前的一些篇目当中看到这个vue发起数据请求的不是使用axios的吗?这个确实没有问题,在

    2024年02月08日
    浏览(40)
  • Vue中的ajax和slot插槽

    在前后端分离项目中,解决跨域问题是一个常见的需求。下面列举了几种常用的跨域解决方法: CORS(跨域资源共享):这是最常用且推荐的跨域解决方案。通过在服务器端设置响应头,允许特定的源(域名、协议、端口)访问资源。在后端服务器上进行配置即可实现跨域请

    2024年02月10日
    浏览(46)
  • Vue2学习之第四章——Vue中的ajax

    解决开发环境 Ajax 跨域问题 配置代理 方式一 在vue.config.js中添加如下配置: 说明: 优点:配置简单,请求资源时直接发给前端(8080)即可。 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么

    2024年01月24日
    浏览(45)
  • [JavaWeb]【二】Vue && Ajax && Elemnet &&Vue路由&&打包部署

    目录 一  什么是Vue  1.1 Vue快速入门 1.2 常用指令  1.2.1 v-bind v-model  1.2.2 v-on  1.2.3 v-if v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍  2.2 同步与异步  2.3 原生Ajax(繁琐,过时了) 2.4 Axios 【重点】 2.4.1 Axios介绍 2.4.2 Axios入门 2.4.3 案例 三 前后端分离开发 3.1 前后端混

    2024年02月12日
    浏览(43)
  • Vue中的Ajax 配置代理 slot插槽

    本案例需要下载 axios 库 npm install axios 配置参考文档 Vue-Cli devServer.proxy vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照

    2024年02月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包