Nativescript Vue - 渲染前 main.js 中的异步操作

Posted

技术标签:

【中文标题】Nativescript Vue - 渲染前 main.js 中的异步操作【英文标题】:Nativescript Vue - async operations in main.js before rendering 【发布时间】:2021-08-10 20:35:35 【问题描述】:

我想通过 Firebase 身份验证向我的应用添加登录页面: https://github.com/EddyVerbruggen/nativescript-plugin-firebase/blob/master/docs/AUTHENTICATION.md

按照指南,我在 init firebase 中添加了“onAuthStateChanged”函数。

现在我想根据 Firebase 函数返回的值将正确的页面传递给 Vue 实例创建中的渲染函数。 如果用户通过身份验证,将呈现“home.vue”页面,否则呈现“login.vue”页面。

问题在于firebase函数在Vue实例创建后返回用户的状态。

这是我的代码:

import Vue from 'nativescript-vue'
import store from './store'
import Home from './components/Page/home.vue'
import Login from './components/Page/login.vue'
import VueDevtools from 'nativescript-vue-devtools'

var firebase = require("@nativescript/firebase").firebase;

var pageToRender;

firebase.init(
  onAuthStateChanged: function(data) 
    if (data.loggedIn) 
      pageToRender = Home;
    else
      pageToRender = Login;
    
  
).then(
    function () 
      console.log("firebase.init done");
    ,
    function (error) 
      console.log("firebase.init error: " + error);
    
);

if(TNS_ENV !== 'production') 
  Vue.use(VueDevtools)


// Prints Vue logs when --env.production is *NOT* set while building
Vue.config.silent = (TNS_ENV === 'production')

new Vue(
  store,
  render: h => h('frame', [h(pageToRender)])
).$start()

我已经尝试将所有代码移动到异步函数中,以便在创建 Vue 实例之前等待 firebase 响应,但我收到错误:

System.err:错误:缺少主条目。应用程序无法启动。 验证应用引导程序。

这样:

async function start()

  var loggedIn = await firebase_start();
  var pageToRender;

  if (loggedIn) 
    pageToRender = Home;
  else
    pageToRender = Login;
  

  if(TNS_ENV !== 'production') 
    Vue.use(VueDevtools)
  

  // Prints Vue logs when --env.production is *NOT* set while building
  Vue.config.silent = (TNS_ENV === 'production')

  new Vue(
    store,
    render: h => h('frame', [h(pageToRender)])
  ).$start()

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我会以不同的方式处理它。

当用户登录时,您可以使用https://github.com/nativescript-community/preferences插件将其保存在设备上,如下所示:

function successLoginUser()
  const prefs = new Preferences();
  prefs.setValue("isUserLogin", true);

然后在启动应用程序时,您可以执行以下操作:

import Vue from 'nativescript-vue'
import store from './store'
import Home from './components/Page/home.vue'
import Login from './components/Page/login.vue'
import VueDevtools from 'nativescript-vue-devtools'

//This
const prefs = new Preferences();
const pageToRender = prefs.getValue("isUserLogin") ? Home: Login ;


if(TNS_ENV !== 'production') 
  Vue.use(VueDevtools)


// Prints Vue logs when --env.production is *NOT* set while building
Vue.config.silent = (TNS_ENV === 'production')

new Vue(
  store,
  render: h => h('frame', [h(pageToRender)])
).$start()

当用户退出时:

const prefs = new Preferences();
prefs.setValue("isUserLogin", false);

没试过,应该可以的

【讨论】:

【参考方案2】:

//for me here firebase is imported from a diffrent file where i already initialized it.
let app;
firebase.auth().onAuthStateChanged((user, error) => 
    //decide which page to render
    //also make sure both components you are trying to render are imported
    if (!app) 
        app = new Vue(
            router,
            store,
            render: (h) => h(PageToRender),
        ).$start()
    
);

【讨论】:

嗨,如果我尝试将 Vue 初始化函数移动到其他点(例如在函数内部,就像你在示例中所做的那样),我会在启动时收到错误:System.err: An uncaught Exception occurred on "main" thread. System.err: Unable to start activity ComponentInfoorg.nativescript.costhly/com.tns.NativeScriptActivity: com.tns.NativeScriptException: Calling js method onCreate failed System.err: Error: Main entry is missing. App cannot be started. Verify app bootstrap.跨度>

以上是关于Nativescript Vue - 渲染前 main.js 中的异步操作的主要内容,如果未能解决你的问题,请参考以下文章

Nativescript-Vue 问题与平移元素

我无法使用 NativeScript 在 jsPDF 中渲染图像

Nativescript Vue图像拉伸aspectFill不起作用

nativescript-vue navigateTo vue 页面道具被缓存

Nativescript-Vue:如何在 ListView 中正确使用 v-for

重新启用按需加载 [NativeScript Vue]