• taro 跳转 webview


    1.封装工具类

    utils/jump.js

    import Taro from '@tarojs/taro'
    
    const PAGE_WEBVIEW = '/pages/webview/webview'
    
    /**
     * // NOTE 后端返回的 url 可能是网页链接,需要在 webview 中打开
     * 也可能是小程序自身的链接,只能用 navigate/redirect 之类的打开
     * 就需要有个地方统一判断处理
     */
    export default function jump(options) {
      const { url, title = '', payload = {}, method = 'navigateTo' } = options
    
      if (/^https?:///.test(url)) {
        Taro[method]({
          url: urlStringify(PAGE_WEBVIEW, { url, title })
        })
      } else if (/^/pages//.test(url)) {
        // TODO H5 不支持 switchTab,暂时 hack 下
        if (process.env.TARO_ENV === 'h5' && method === 'switchTab') {
          Taro.navigateBack({ delta: Taro.getCurrentPages().length - 1 })
          setTimeout(() => { Taro.redirectTo({ url }) }, 100)
          return
        }
    
        Taro[method]({
          url: urlStringify(url, payload)
        })
      }
    }
    
    function urlStringify(url, payload, encode = true) {
      const arr = Object.keys(payload).map(key =>
        `${key}=${encode ? encodeURIComponent(payload[key]) : payload[key]}`
      )
    
      // NOTE 注意支付宝小程序跳转链接如果没有参数,就不要带上 ?,否则可能无法跳转
      return arr.length ? `${url}?${arr.join('&')}` : url
    }
    

    2.webview 页面

    src/pages/webview/webview.js

    import Taro, { Component } from '@tarojs/taro'
    import { View, WebView } from '@tarojs/components'
    /**
     * // NOTE Taro 的 RN 端还未提供 WebView 组件,可以引入原生组件来解决
     * (备注:Taro v1.2.16 已支持,这块代码还是保留作为演示)
     *
     * Taro 有开启了 tree shaking,对于未用到的内容编译时会自动去除
     * 因此可以把相应端的内容都 import 进来,再根据环境进行调用即可
     *
     * 另外 1.2.17 版本有提供了统一接口方式 https://nervjs.github.io/taro/docs/envs.html
     * 可以参考 ./src/pages/user-login 中的实现
     */
    import WebViewRN from './rn'
    import './webview.scss'
    
    export default class extends Component {
      config = {
        navigationBarTitleText: ''
      }
    
      url = ''
      title = ''
    
      componentWillMount() {
        this.url = decodeURIComponent(this.$router.params.url || '')
        this.title = decodeURIComponent(this.$router.params.title || '')
        Taro.setNavigationBarTitle({ title: this.title })
      }
    
      render () {
        return (
          <View className='webview'>
            {/* // NOTE 编译时只会保留相应端的内容,因此非 RN 端时不会编译 WebViewRN */}
            {process.env.TARO_ENV === 'rn' ?
              <WebViewRN src={this.url} /> :
              <WebView src={this.url} />
            }
          </View>
        )
      }
    }
    

    src/pages/webview/webview.scss

    .webview {
      height: 100%;
    }

    src/pages/webview/rn/index.js

    /**
     * React Native 原生组件
     */
    import Taro, { Component } from '@tarojs/taro'
    import { WebView } from 'react-native'
    
    export default class WebViewRN extends Component {
      render() {
        return (
          <WebView
            style={{ height: '100%' }}
            originWhitelist={['*']}
            source={{ uri: this.props.src }}
          />
        )
      }
    }
    

    .

  • 相关阅读:
    ClouderaManager与CDH
    教辅的组成
    国家集训队 小Z的袜子
    国家集训队 旅游
    NOIP2015 子串
    数颜色
    间谍网络
    NOIP2017 逛公园
    APIO2009 抢掠计划
    JLOI2014 松鼠的新家
  • 原文地址:https://www.cnblogs.com/crazycode2/p/12875926.html
Copyright © 2020-2023  润新知