1. 前言
render
函数其实之前工作中用的非常多,因为之前有部分项目是很多列表需要编辑,修改,等操作,都需要自己布局 ,所以用的render
比较多
v3
对render
做了简化,,写起来更方便了
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>
网友评论