vue3-render-fetch封装

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

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>



相关文章
|
7月前
|
JavaScript
vue组件中data为什么必须是一个函数
Vue.js 组件的 data 选项必须是一个函数,这是为了确保每个组件实例都有自己的独立数据副本,从而避免数据污染和确保组件的复用性和可预测性
|
2月前
|
前端开发 JavaScript 开发者
|
2月前
|
JavaScript 开发者
Vue Render函数
【10月更文挑战第11天】 Vue 的 Render 函数提供了一种强大而灵活的方法来创建虚拟 DOM 节点,使开发者能够更精细地控制组件的构建过程。通过 `createElement` 参数,可以动态生成各种元素和组件,实现复杂逻辑和高级定制。尽管使用 Render 函数需要更多代码和对虚拟 DOM 的深入理解,但它在处理复杂场景时展现出巨大的优势。
19 2
|
2月前
|
JavaScript
vue 组件中的 data 为什么是一个函数 ?
【10月更文挑战第8天】 在 Vue 组件中,`data` 被定义为一个函数而非普通对象,以确保每个组件实例拥有独立的数据空间,避免数据混乱。这种方式还支持数据的响应式更新、组件的继承与扩展,并有助于避免潜在问题,提升应用的可靠性和性能。
24 2
|
2月前
|
JavaScript 开发者
Vue Render函数
【10月更文挑战第4天】
18 0
|
6月前
|
JavaScript
vue组件中data为什么必须是一个函数?
vue组件中data为什么必须是一个函数?
45 1
|
JavaScript
53Vue - 组件的使用(data 必须是函数)
53Vue - 组件的使用(data 必须是函数)
30 0
|
7月前
|
JavaScript 前端开发
Vue中的render函数是什么?它与模板的区别是什么?
Vue中的render函数是什么?它与模板的区别是什么?
183 1
|
7月前
|
JavaScript 前端开发 API
Vue中的render函数和template渲染原理有什么不同?
Vue中的render函数和template渲染原理有什么不同?
184 0
|
缓存 JavaScript API
vue.js之componentd、methods和watch的区别详解?
vue.js之componentd、methods和watch的区别详解?