实现简单的axios异步增删改查功能

手动实现一个简单的 axios 增删改查的功能封装,实现非 rest API 接口的数据请求,数据的模拟用 json-server 来实现

预备数据

首先,全局安装 json-server

npm install -g json-server

在本地建立 db.json 文,并填充数据

{
  "posts": [
    {"id": 1, "title": "json-server", "author": "typicode"},
    {"id": 2, "title": "json-server2", "author": "typicode2"},
    {"title": "json-server+++", "author": "typicode+++", "id": 3}
  ],
  "comments": [
  	{"id": 1, "body": "some comment", "postId": 1}
  ],
  "profile": {
    "name": "typicode"
  }
}

实现原理

html 代码

<div>
    <button onclick="testGet()">xhr发送GET请求</button>
    <button onclick="testPost()">xhr发送请POST求</button>
    <button onclick="testPut()">xhr发送PUT请求</button>
    <button onclick="testDelete()">xhr发送DELETE请求</button>
</div>

js 代码

// 引入 xios
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.20.0/axios.min.js"></script>
<script>
    // 调用axios
    function testGet() {
        axios({
            url: 'http://localhost:3000/posts',
            method: "get",
            params: {
                'id': 2,
                "title": 'json-server2'
            }
        }).then(
            response => {
            	console.log(response)
            },
            error => {
            	alert(error.message)
        	}
        )
    }

    function testPost() {
        axios({
            url: 'http://localhost:3000/posts',
            method: "post",
            data: {
                "title": "json-server---",
                "author": "typicode---"
            }
        }).then(
            response => {
            	console.log(response)
            },
            error => {
            	alert(error.message)
            }
        )
    }

    function testPut() {
        axios({
            url: 'http://localhost:3000/posts/3',
            method: "put",
            data: {
                "title": "json-server+++",
                "author": "typicode+++"
            }
        }).then(
            response => {
            	console.log(response)
            },
            error => {
            	alert(error.message)
            }
        )
    }

    function testDelete() {
        axios({
            url: 'http://localhost:3000/posts/4',
            method: "delete",
        }).then(
            response => {
           		console.log(response)
            },
            error => {
            	alert(error.message)
            }
        )
    }
    
    /**
    * 封装axios ---> 原理
    */
    function axios({
        url,
        method = 'GET',
        params = {},
        data = {}
    }) {
    	// 返回一个promise对象
        return new Promise((resolve, reject) => {
        	// 处理method,变为大写
        	method = method.toUpperCase()

            // 处理query参数(拼接到url上) id=1&xxx=abc
            /*
            {
                id: 1,
                xxx: abc
            }
            */
        	let queryString = ''
            Object.keys(params).forEach((key) => {
            	queryString += `${key}=${params[key]}&`
            })

            if (queryString) {
                // 去除最后面的&
                queryString = queryString.substring(0, queryString.length - 1)
                // 拼接到url上
                url += '?' + queryString
            }

            // 1.执行异步ajax请求
            // 创建xhr对象
            const request = new XMLHttpRequest()
            
            // 打开连接(初始化请求,没有请求)
            request.open(method, url, true) // 开启异步
            
            // 发送请求
            // 这里有method必须要大写,因为上面己经处理method为大写,保持一致
            if (method === 'GET' || method === 'DELETE') {
            	request.send()
            } else if (method === 'POST' || method === 'PUT') {
                // 发送json数据时,要设置请求头,告诉服务器,请求体的格式是json
                request.setRequestHeader('Content-Type', 'application/json;charset=utf-8')
                request.send(JSON.stringify(data)) // 发送json格式请求体参数
            }

            // 2.绑定状态改变的监听
            request.onreadystatechange = function() {
                // 如果请求没有完成,直接结束
                if (request.readyState !== 4) {
                	return
                }

                // 如果状态响应码在200-300之间,代表成功,否则失败
                const {
                    status,
                    statusText
                } = request
                
                // 2.1.如果请求成功了,调用resolve()
                if (status >= 200 & status <= 299) {
                    // 准备结果数据对象response
                    const response = {
                        data: JSON.parse(request.response),
                        status,
                        statusText
                    }
                	resolve(response)
                } else {
                	// 2.2. 如果请求失败了,调用reject()
                	reject(new Error('request error status is ' + status))
              	}
            }
        })
    }
</script>
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要详细说明。首先,需要明确一下这个功能的具体需求和实现方式,然后再分别介绍如何使用Vue组件化、Vue路由、Vuex和Axios实现增删改查功能。 1. 需求和实现方式 假设我们需要实现一个用户管理系统,包括增加用户、删除用户、修改用户信息和查询用户信息等功能。我们可以采用前后端分离的方式,前端使用Vue框架实现,后端使用Node.js和MongoDB实现。 具体实现方式如下: - 前端采用Vue组件化实现页面结构,Vue路由实现页面跳转,Vuex实现状态管理,Axios实现数据请求和响应; - 后端采用Node.js实现服务器端逻辑,MongoDB实现数据存储和管理。 2. Vue组件化 Vue组件化是Vue框架的核心特性之一,它将Web应用程序划分为独立的、可复用的组件,每个组件都有自己的模板、样式和逻辑。在实现增删改查功能时,我们可以将每个功能拆分成一个独立的组件,然后将它们组合成一个完整的应用程序。 下面是一个示例代码,展示如何定义一个Vue组件: ```javascript <template> <div> <h2>{{ title }}</h2> <ul> <li v-for="item in list" :key="item.id"> {{ item.name }} - {{ item.age }} </li> </ul> </div> </template> <script> export default { name: 'UserList', props: { title: String, list: Array } } </script> <style scoped> h2 { color: red; } </style> ``` 在上面的代码中,我们定义了一个名为UserList的Vue组件,它包含一个标题title和一个列表list,用于展示用户信息。使用Vue组件化,我们可以将这个组件嵌入到其他组件中,实现复用和拼装。 3. Vue路由 Vue路由是Vue框架提供的路由管理工具,它能够实现页面的跳转和参数传递。在实现增删改查功能时,我们通常需要多个页面进行交互,而Vue路由可以帮助我们管理这些页面。 下面是一个示例代码,展示如何定义Vue路由: ```javascript import Vue from 'vue' import Router from 'vue-router' import UserList from '@/components/UserList' import UserDetail from '@/components/UserDetail' import UserAdd from '@/components/UserAdd' import UserEdit from '@/components/UserEdit' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'UserList', component: UserList }, { path: '/detail/:id', name: 'UserDetail', component: UserDetail }, { path: '/add', name: 'UserAdd', component: UserAdd }, { path: '/edit/:id', name: 'UserEdit', component: UserEdit } ] }) ``` 在上面的代码中,我们定义了四个路由,分别对应用户列表、用户详情、新增用户和修改用户信息。使用Vue路由,我们可以通过路由跳转实现这些页面之间的切换。 4. Vuex Vuex是Vue框架提供的状态管理工具,它能够实现不同组件之间的数据共享和状态管理。在实现增删改查功能时,我们需要共享用户数据,并且需要管理用户数据的状态,Vuex可以帮助我们实现这些功能。 下面是一个示例代码,展示如何使用Vuex管理用户数据: ```javascript import Vue from 'vue' import Vuex from 'vuex' import axios from 'axios' Vue.use(Vuex) export default new Vuex.Store({ state: { userList: [] }, mutations: { setUserList(state, list) { state.userList = list }, addUser(state, user) { state.userList.push(user) }, removeUser(state, id) { state.userList = state.userList.filter(item => item.id !== id) }, updateUser(state, user) { state.userList = state.userList.map(item => { if (item.id === user.id) { return user } else { return item } }) } }, actions: { fetchUserList({ commit }) { axios.get('/api/user/list').then(res => { commit('setUserList', res.data) }) }, addUser({ commit }, user) { axios.post('/api/user/add', user).then(res => { commit('addUser', res.data) }) }, removeUser({ commit }, id) { axios.delete(`/api/user/remove/${id}`).then(res => { commit('removeUser', id) }) }, updateUser({ commit }, user) { axios.put(`/api/user/update/${user.id}`, user).then(res => { commit('updateUser', user) }) } } }) ``` 在上面的代码中,我们定义了一个名为userList的状态,用于存储用户数据。使用Vuex,我们可以通过mutations定义修改state的方法,通过actions定义异步操作,然后在组件中通过mapState、mapGetters、mapMutations和mapActions等工具来访问和修改状态。 5. Axios Axios是一个基于Promise的HTTP客户端,它能够处理请求和响应,支持拦截器、取消请求等功能。在实现增删改查功能时,我们需要向后端发送请求并接收响应,Axios可以帮助我们实现这些功能。 下面是一个示例代码,展示如何使用Axios发送请求和接收响应: ```javascript import axios from 'axios' axios.defaults.baseURL = 'http://localhost:3000' export function fetchUserList() { return axios.get('/api/user/list') } export function addUser(user) { return axios.post('/api/user/add', user) } export function removeUser(id) { return axios.delete(`/api/user/remove/${id}`) } export function updateUser(user) { return axios.put(`/api/user/update/${user.id}`, user) } ``` 在上面的代码中,我们定义了四个请求方法,分别对应获取用户列表、新增用户、删除用户和修改用户信息。使用Axios,我们可以轻松地发送请求和接收响应,并进行错误处理和拦截器操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值