framework7 入门(数据获取和传递)

时间:2023-03-09 04:28:48
framework7 入门(数据获取和传递)

数据获取

framework7自带request方法 ,

var app = new Framework7({
...
});
app.request(parameters) 或者 Framework7.request(parameters)
两者都一样

一个完整的请求可能长下面这样

app.request.get(url, data, success, error, dataType)

app.request.get("res.xxx", {name:'xxx'}, function(data){
console.log(data);
}, function(){
console.log("获取数据失败");
}, 'json');
并不推荐这种方式 推荐下面这种,清晰明了
app.request.get({
url:"res.xxx",
data:{name:"xxx"},  
success:function(data){
console.log(data)
},
error:function(){
console.log("数据获取失败")
},
dataType:"json"
});

获取数据之后就要传数据,有几种方法

通过路由

framework7给路由提供一个async方法

routes:[
{
path: '/about/', //componentUrl:"./pages/about.html",
async: function (routeTo, routeFrom, resolve, reject) {
app.request.get('res.xxx', function (data) {
resolve(
{
componentUrl:"./pages/about.html"
},                 
{
context: { //传数据
users: data,
},
}
);
});
}
}
]
注意,除非你在 async 方法中执行了 resolve 或 reject ,否则路由请求将会中断!

about.html 是个 template组件,所以routers  长这样

{
path:'xxx',
componentUrl:"xxx.html"
}

如果是个完整的html

{
path:'xxx',
url:"xxx.html"
}

还有一些别的参数,参考官方文档

async方法可以用在 当用户未登录时拦截跳转,然后导航到登录页

在about.html页我们可以取到这个users

<template>
<div class="page">
about
<h1>{{Name}}</h1>
</div>
</template>
<style></style>
<script>
return{
data:function(){ //数据相关
let name=this.$route.context.users;
return { //返回要绑定的数据
Name:name
}
}
}
</script>

还可以放在data里

return{
data:function(){
app.request.get({
url:"xxx",
...
success:function(data){
var name=data.name;
}
});
return {
Name:name
}
}
}

看看return

return{
data:function(){
...
},
methods:{
showHello:function(){
app.dialog.alert("Hello");
}
},
on:{ //on里面的函数,在不同的生命周期执行
pageMounted:function(e){}, pageInit:function(e){
this.showHello();
}, pageBeforeIn:function(e){}, pageAfterIn:function(e){}
}
}

这两种方法会有点问题,当你获取数据很慢时,会发现你能在pageInit里打印出data,但没法绑到页面上,原因在于取到data时 ,页面已经渲染完成,不会重新渲染,直到3.31版加了个$setState方法,

return{
data:function(){
return {
Name:""
}
},
methods:{
getData:function(func){
app.request.get({
url:"res.xxx",
...
success:function(data){
func(data);
}
});
}
},
on:{
pageInit:function(){
let self=this;
self.getDate(function(data){
self.$setState({
Name:data.name
});
});
}
}
}

这样就不用担心dom渲染完而数据还没取到

$setState是用VDOM实现的。我理解的是,页面渲染时生成一个dom树,执行$setState时,会在内存中生成一个dom树,然后对两个dom进行对比,用内存中变化的节点替换浏览器中原来的节点,然后让浏览器重新渲染这个节点。