页面的各个功能讲解

在娜娜奇中,页面的许多功能是由配置对象与钩子提供。

page2.jpg

从上到下,划分成几个功能区,标题栏(titleBar), 右上角按钮(会弹出菜单,里面包含转发,创建快捷方式到桌面,关于等功能),内容区(这是由页面组件的JSX渲染出来的),切换栏(tabBar, 切换小程序、快应用的页面), 系统导航栏(手机系统级别,放虚拟HOME键, 返回按钮, 切换抽屉)

标题栏

  1. class P extends React.Component{
  2. static config = {
  3. navigationBarBackgroundColor: "#a9ea00",
  4. navigationBarTextStyle: "back",
  5. navigationBarTitleText: "用户中心"
  6. }
  7. render(){
  8. return <div>.....</div>
  9. }
  10. }

如果页面没有配置标题栏,那么它就会使用app.js中的标题栏。如果想隐藏标题栏,可以在配置对象 navigationStyle:custom, 那么它就会自动消失。

在快应用要隐藏某一个页面的titleBar, 需要manifest.json中配置。但放心,娜娜奇已经帮你屏蔽掉。

  1. "display": {
  2. "backgroundColor": "#ffffff",
  3. "fullScreen": false,
  4. "menu": true, //右上角菜单
  5. "titleBar": true, //app级别
  6. "titleBarBackgroundColor": "#000000", //app级别
  7. "titleBarTextColor": "#fffff", //app级别
  8. "pages": {
  9. "Hello": { //对应某一个页面的ID
  10. "backgroundColor": "#eeeeee",
  11. "fullScreen": true,
  12. "titleBarBackgroundColor": "#0000ff", //page级别
  13. "titleBarText": "Hello", //page级别
  14. "orientation": "landscape" //page级别
  15. // "titleBar": true/false
  16. }
  17. }
  18. },
与标题栏相关的配置项类型默认值说明
navigationBarBackgroundColorHexColor#000000导航栏背景颜色,如 #000000
navigationBarTextStylestringwhite导航栏标题颜色,仅支持 black / white
navigationBarTitleTextstring导航栏标题文字内容
navigationStylestringdefault显示标题用default,隐藏用custom,这时只保留右上角按钮

想动态设置页面的标题栏可以使用下面API

  • React.api.setNavigationBarTitle({title})
  • React.api.setNavigationBarColor({frontColor, backgroundColor})
    微信客户端 6.7.2 版本开始,navigationStyle: custom 对 <web-view> 组件无效

webview里面的相关操作

  1. //仅支持微信小程序
  2. document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
  3. // 通过下面这个API隐藏底部导航栏
  4. WeixinJSBridge.call('hideToolbar');
  5. });
  6. document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
  7. // 通过下面这个API显示底部导航栏
  8. WeixinJSBridge.call('showToolbar');
  9. })

右上角按钮

在原生微信小程序中,只要onShareAppMessage定义就会出现右上角菜单。在娜娜奇中,右上角菜单则总是存在, 并且这个钩子也改名,简化为更好记的onShare, 如果页面没有定义onShare钩子, 它就会使用app.js的全局钩子onGlobalShare

  1. class P extends React.Component{
  2. static config = {
  3. navigationBarBackgroundColor: "#a9ea00",
  4. navigationBarTextStyle: "back",
  5. navigationBarTitleText: "用户中心"
  6. }
  7. onShare(){
  8. return {
  9. title: '预订火车票 - 去哪儿旅行',
  10. imageUrl: 'https://s.aaa.com/bbb/ccc.jpg',
  11. path: `xx/yy`
  12. }
  13. }
  14. render(){
  15. return <div>.....</div>
  16. }
  17. }

如果想兼容快应用, 还需要在app.js添加一个onShowMenu钩子, 详见转发分享

想动态设置右上角按钮可以使用下面API

  • React.api.showShareMenu() 快应用不支持
  • React.api.hideShareMenu() 快应用不支持
    隐藏微信网页右上角按钮
  1. document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
  2. // 通过下面这个API隐藏右上角按钮
  3. WeixinJSBridge.call('hideOptionMenu');
  4. });
  5. document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
  6. // 通过下面这个API显示右上角按钮
  7. WeixinJSBridge.call('showOptionMenu');
  8. })

切换栏

这是一个非常复杂的功能,涉及众多配置项,但我们要求遵循微信的配置名。如果当前页面config没有tabBar配置对象, 那么我们就使用app.js中的tabBar配置对象。

  1. //app.js
  2. class Global extends React.Component {
  3. static config = {
  4. window: {
  5. backgroundTextStyle: 'light',
  6. navigationBarTitleText: 'mpreact',
  7. navigationBarTextStyle: 'white'
  8. },
  9. tabBar: {
  10. color: '#929292',
  11. selectedColor: '#00bcd4',
  12. borderStyle: 'black',
  13. backgroundColor: '#ffffff',
  14. list: [
  15. {
  16. pagePath: 'pages/index/index',
  17. iconPath: '/assets/image/homepage_normal.png',
  18. selectedIconPath: '/assets/image/homepage_select.png',
  19. text: '首页'
  20. },
  21. {
  22. pagePath: 'pages/demo/question/index/index',
  23. iconPath: '/assets/image/question_normal.png',
  24. selectedIconPath: '/assets/image/question_select.png',
  25. text: '问答社区'
  26. },
  27. {
  28. pagePath: 'pages/demo/userCenter/index',
  29. iconPath: '/assets/image/uc_normal.png',
  30. selectedIconPath: '/assets/image/uc_select.png',
  31. text: '我的'
  32. }
  33. ]
  34. }
  35. };
  36. render(){
  37. return null
  38. }
  39. // pages/page1/index.js 由于存在tabBar配置对象,但是list的长度为零,不会显示 tabBar
  40. class P1 extends React.Component {
  41. static config = {
  42. tabBar: {
  43. color: '#929292',
  44. selectedColor: '#00bcd4',
  45. borderStyle: 'black',
  46. backgroundColor: '#ffffff',
  47. list: []
  48. }
  49. }
  50. render(){
  51. return <div>page1</div>
  52. }
  53. }
  54. // pages/page2/index.js 由于没有tabBar配置对象,这时此页面有tabBar,为app.js所定义的那样
  55. class P2 extends React.Component {
  56. static config = {
  57. }
  58. render(){
  59. return <div>page2</div>
  60. }
  61. }

想动态设置tabBar可以使用下面API

  • React.api.showTabBar() 快应用不支持
  • React.api.hideTabBar() 快应用不支持

系统导航栏

它只与快应用页面的onBackPress钩子有关。

当用户点击返回实体按键、左上角返回菜单、调用返回API时触发该事件

如果事件响应方法最后返回true表示不返回,自己处理业务逻辑(完毕后开发者自行调用 API 返回);否则:不返回数据,或者返回其它数据:表示遵循系统逻辑:返回到上一页

  1. class P2 extends React.Component {
  2. static config = {
  3. }
  4. onBackPress(){
  5. //让用户操作无效
  6. return true
  7. }
  8. render(){
  9. return <div>page2</div>
  10. }
  11. }