页面参数的获取

在小程序中,想获取上一个页面跳转后带过来的参数是非常容易的。微信,字节跳动,支付宝,百度小程序直接利用onShow方法,就可以获取参数对象。或者在React生命周期钩子中访问this.props.query获取

  1. import React from '@react';
  2. import Welcome from '@components/Welcome/index';
  3. import './index.scss';
  4. class P extends React.Component {
  5. componentDidMount() {
  6. // eslint-disable-next-line
  7. console.log('page did mount!', this.props.query);
  8. }
  9. onShow(queryObject){
  10. console.log(queryObject) // {a: 111, b: false}
  11. }
  12. render() {
  13. return (
  14. <div class='page'>
  15. <Welcome text='nanachi' />
  16. </div>
  17. );
  18. }
  19. }
  20. export default P;
  1. var globalHooks = {
  2. onShare: 'onGlobalShare',
  3. onShow: 'onGlobalShow',
  4. onHide: 'onGlobalHide'
  5. };
  6. config.onShow = function(e) {
  7. let instance = this.reactInstance,
  8. fn = instance.onShow
  9. //支付宝小程序不存在this.options
  10. instance.props.query = this.options ? this.options : e || {}
  11. var param = instance.props.query
  12. if (isFn(fn)) {//页面级别
  13. fn.call(instance, param);
  14. }
  15. var globalHook = globalHooks.onShow
  16. if (globalHook){//应用级别
  17. ret = callGlobalHook(globalHook, param);
  18. }
  19. };

而快应用是onShow是没有参数,需要通过其他技巧来自行拼装这个对象。

  • 如果快应用引擎直接支持从this.$page.query拿到这个对象,那么我们可以什么都不用做,但这个需要非常新的版本。
  • 如果快应用引擎请允许我们从this.$page.uri中以提取的方式构建这个对象,那么我们可以在框架中处理掉。
  • 但在华为快应用1040中,上述方案都不行,我们会从React.api.navigateTo/redirectTo/navigateBack方法中保留上一次用户的传参对象。
  • 但如果这个页面从webview跳到快应用,这种方式也行不通,我们需要第四种方案,需要用户手动为页面实例添加一个protected静态对象, 这样框架就能从页面的小程序实例上抽取到想要的参数。
  1. import React from '@react';
  2. import Welcome from '@components/Welcome/index';
  3. import './index.scss';
  4. class P extends React.Component {
  5. componentDidMount() {
  6. // eslint-disable-next-line
  7. console.log('page did mount!', this.props.query);
  8. }
  9. static protected = process.env.ANU_ENV === 'quick' ? {param1: 0, param2: 0, param3: 0} : {}
  10. onShow(queryObject){
  11. console.log(queryObject) // {a: 111, b: false, c: {}}
  12. }
  13. render() {
  14. return (
  15. <div class='page'>
  16. <Welcome text='nanachi' />
  17. </div>
  18. );
  19. }
  20. }
  21. export default P;

因此想支持华为快应用我们需要为页面多定义一个protected对象。

而快应用的onShow是这样实现的:

  1. import { getQueryFromUri } from './apiForQuick/router'
  2. var globalHooks = {
  3. onShareAppMessage: 'onGlobalShare',
  4. onShow: 'onGlobalShow',
  5. onHide: 'onGlobalHide'
  6. }
  7. function getQuery (wx, huaweiHack) {
  8. var page = wx.$page;
  9. if(page.query){//小米快应用新规范,this.$page.query 返回页面启动时的参数数据;
  10. return page.query;
  11. }
  12. var query = {};
  13. //小米快应用直接从page.uri中抽取参数
  14. if(page.uri){
  15. getQueryFromUri(page.uri, query )
  16. for(var param in query){
  17. return query;
  18. }
  19. }
  20. //华为快应用从protected中抽取
  21. if(Object.keys(huaweiHack).length){
  22. for(var i in huaweiHack){
  23. query[i] = wx[i];
  24. }
  25. return query;
  26. }
  27. //否则返回navigateTo/redirectTo/navigateBack中储存起来的参数
  28. return Object((_getApp().globalData || {}).__quickQuery)[page.path] || query;
  29. }
  30. Array('onShow', 'onHide', 'onMenuPress').forEach(function (hook) {
  31. config[hook] = function (e) {
  32. let instance = this.reactInstance,
  33. fn = instance[hook],
  34. app = _getApp(),
  35. param = e
  36. if (hook === 'onShow') {
  37. param = instance.props.query =getQuery(this, PageClass.protected)
  38. app.$$page = instance.wx;
  39. app.$$pagePath = instance.props.path;
  40. }
  41. if (hook === 'onMenuPress') {
  42. app.onShowMenu && app.onShowMenu(instance, this.$app);
  43. } else if (isFn(fn)) {
  44. fn.call(instance, param);
  45. }
  46. let globalHook = globalHooks[hook];
  47. if (globalHook) {
  48. callGlobalHook(globalHook, param);
  49. }
  50. }
  51. })
  52. return config
  53. }