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 }}
/>
)
}
}
.

浙公网安备 33010602011771号