美文网首页
vue3-render-fetch封装

vue3-render-fetch封装

作者: 云高风轻 | 来源:发表于2021-09-13 22:11 被阅读0次

1. 前言

render函数其实之前工作中用的非常多,因为之前有部分项目是很多列表需要编辑,修改,等操作,都需要自己布局 ,所以用的render比较多
v3render做了简化,,写起来更方便了


2. render

1.字符串模板的另一种选择,允许你充分利用 JavaScript的编程功能。
2.render函数的优先级于从挂载元素 template 选项或内置 DOM 提取出的 HTML 模板编译渲染函数。


2.1 简要代码

组件使用

 app.component('my-title', {
  render() {
    return Vue.h(
      'h1',           // 标签名称
      this.blogTitle  // 标签内容
    )
  },
  props: {
    blogTitle: {
      type: String,
      required: true
    }
  }
})

2.2 单文件组件使用

import {reactive,h,toRefs} from "vue";
export default {
    setup () {
        const  state =   reactive({
            count:1
        })
        return {...toRefs(state)}
    },
      //可以把 template注释掉
  render(){
    return h("div",{title:"渲染函数",yzs:"自定义属性也可以"},this.count)
  }
}

2.3 分析

1.h函数因为源码底层这个函数就叫h
2.第二个参数是属性对象,属于可选的,不写也行,属性也可以自定义
3.第三个参数就是标签内容
4.render函数和setup是同级的


2.4 嵌套

render(){
    return h("div",{title:"渲染函数"},[h("h1",{title:"标题"},"是是")])
  }

这个嵌套可以一直进行下去,当然一般也不会嵌套几层,结构太乱了


3. fetch 基础封装

src/config/indexjs

3.1 简要代码

export default async(url = '', data = {}, type = 'GET', method = 'fetch') => {
    const baseUrl = "https://xx.yzs.org"
    type = type.toUpperCase();
    url = baseUrl + url;

    if (type == 'GET') {
        let dataStr = ''; //数据拼接字符串
        Object.keys(data).forEach(key => {
            dataStr += key + '=' + data[key] + '&';
        })

        if (dataStr !== '') {
            dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
            url = url + '?' + dataStr;
        }
    }

    if (window.fetch && method == 'fetch') {
        let requestConfig = {
            credentials: 'include',
            method: type,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            mode: "cors",
            cache: "force-cache"
        }

        if (type == 'POST') {
            Object.defineProperty(requestConfig, 'body', {
                value: JSON.stringify(data)
            })
        }
        
        try {
            const response = await fetch(url, requestConfig);
            const responseJson = await response.json();
            return responseJson
        } catch (error) {
            throw new Error(error)
        }
    } else {
        return new Promise((resolve, reject) => {
            let requestObj;
            if (window.XMLHttpRequest) {
                requestObj = new XMLHttpRequest();
            } else {
                requestObj = new ActiveXObject;
            }

            let sendData = '';
            if (type == 'POST') {
                sendData = JSON.stringify(data);
            }

            requestObj.open(type, url, true);
            requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            requestObj.send(sendData);

            requestObj.onreadystatechange = () => {
                if (requestObj.readyState == 4) {
                    if (requestObj.status == 200) {
                        let obj = requestObj.response
                        if (typeof obj !== 'object') {
                            obj = JSON.parse(obj);
                        }
                        resolve(obj)
                    } else {
                        reject(requestObj)
                    }
                }
            }
        })
    }
}

4. fecth 接口封装

src/api/login.js

4.1 登录接口封装

import fetch from "@/config"
/**
 * 账号密码登录
 */
export const accountLogin = (username, password, captcha_code) => fetch('/v2/login', {username, password, captcha_code}, 'POST');

4.2 列表封装

export const getList= () => fetch('/v1/list', {
    type: 1
});

5. 接口使用

5.1 引入

import { reactive, toRefs ,onMounted} from 'vue'
import {cityGuess, getList} from '@/api/getData'

5.2 setup核心

export default {
    setup () {
        const state = reactive({
            count: 0,
            name:""
        })
        onMounted(() => {
             //列表
            getList().then(res => {
                    console.log("REs-----------:",res)
                    state.name = res.name
            })
            accountLogin("用户名","密码","验证码").then(res => {
                    console.log("REs-----------:",res)
            }).catch(err=>{
                console.log("err:",err)
            })
        })
        return {
            ...toRefs(state),
        }
    }
}

6. 模板

<template>
    <div>
        <h1> 登录 fetch</h1>
        <h1>{{name}}</h1>
    </div>
</template>

参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉

相关文章

  • vue3-render-fetch封装

    1. 前言 render函数其实之前工作中用的非常多,因为之前有部分项目是很多列表需要编辑,修改,等操作,都需要自...

  • JavaScript面向对象与设计模式

    1. 面向对象 1.1 封装 封装的目的在于将信息隐藏。广义的封装不仅包括封装数据和封装实现,还包括封装类型和封装...

  • 02.OOP面向对象-3.一些理解

    对封装的理解?封装,类本身就是一个封装,封装了属性和方法。方法也是封装,对一些业务逻辑的封装。私有也是封装,将一些...

  • 封装微信小程序请求

    封装wx.request 封装api 封装请求调用

  • python 文件及文件夹的操作和异常捕获

    1、面向对象的特征:封装、继承、多态 1.1、封装: 函数一种封装,封装了一些逻辑代码 类也是一种封装,封装属性和...

  • node学习4

    Nodejs 路由模块封装、封装仿照 express 的路由 Nodejs 路由模块封装 封装仿照 express...

  • 封装组件

    封装tab组件封装曝光加载组件封装轮播组件 代码

  • MVVM在网络中应用(OkHttp+Retrofit+Gson+

    1.封装请求地址常量类 2.封装网络工具类 3.封装接口类 4.封装DTO类——即返回的数据封装模型 5.封装请求...

  • view的封装

    封装view较为简单,封装tableview比较麻烦,封装tableview的方法后面会有。 view的封装 如果...

  • 记录封装好的axios

    拦截封装 路由封装

网友评论

      本文标题:vue3-render-fetch封装

      本文链接:https://www.haomeiwen.com/subject/decqgltx.html