首页 > 作文

Taro自定义Modal对话框组件

更新时间:2023-04-03 09:40:56 阅读: 评论:0

基于taro多端实践taropop:自定义模态框|dialog对话框|msg消息框|toast提示

taro自定义弹出框支持编译到多端h5/小程序/reactnative,还可以自定义弹窗类型/弹窗样式、多按钮事件/样式、自动关闭、遮罩层、弹窗显示位置及自定义内容模板

用法

在相应页面引入组件

import taropop from @components/taropop

import taro from '@tarojs/taro'import { view, text } from '@tarojs/components'// 引入自定义弹窗组件import taropop from '@components/taropop'export default class taropopdemo extends taro.component {    ...    render() {        return (            <view classname="taro-container">                ...                        山重水复疑无路的作者是谁        {/* 引入弹窗模板 */}                <taropop ref="taropop" />            </view>        );    }}

通过ref方式调用组件内show、clo方法

this.refs.taropop.show({…options})

this.refs.taropop.clo()

自定义弹窗模板内容(如下图)

只需把页面上的模板写成如下即可,调用方式还和上面一样

<taropop ref="taropoptpl">    ...</taropop>

支持多种参数配置:

/**  * @ 弹窗默认配置  */static defaultprops = {    isvisible: fal,       //弹窗显示        title: '',              //标题    content: '',            //内容    contentstyle: null,     //内容样式    style: null,            //自定义弹窗样式    skin: '',               //弹窗风格    icon: '',               //弹窗图标    xclo: fal,          //自定义关闭按钮        shade: true,            //遮罩层    shadeclo: true,       //点击遮罩关闭    opacity: '',            //遮罩透明度    time: 0,                //自动关闭时间    end: null,              //销毁弹窗回调函数        p宣传稿osition: '',           //弹窗位置显示    btns: null,             //弹窗按钮 [{...args}, {...args}]}
/**  * 显示弹窗事件  */show = (options) => {    this.tstate({        ...this.props, ...options, isvisible: true    })}/**  * 关闭弹窗事件  */clo = () => {    this.tstate({...this.props})    this.timer && cleartimeout(this.timer)    delete this.timer    typeof this.state.end === 'function' && this.state.end.call(this)}/**  * 点击遮罩关闭  */shadeclick = () => {    if(!this.state.国际宽容日shadeclo) return    this.clo()}

msg消息框提示

this.refs.taropop.show({    content: 'taro自定义模态modal弹窗',    shadeclo: fal,    style: {backgroundcolor: 'rgba(0,0,0,.7)', borderradius: 6},    contentstyle: {color: '#fff', fontsize: 12, padding: 12},    time: 3,    opacity: .2,})

toast轻提示效果(success | error | info | loading四种图标

let taropop = this.refs.taropoptaropop.show({    skin: 'toast',    content: 'loading',    icon: 'loading', //success | info | error | loading    shade: fal,    time: 3})

android弹窗效果

let taropop = this.refs.taropoptaropop.show({    skin: 'android',    title: '邮件提醒',    content: '系统检测到你未开启新邮件提醒功能,为了保证新邮件能及时收到提醒,请前往系统 [设置] - [应用] 中开启',    shadeclo: fal,        btns: [        {            text: '取消',            onclick() {                taropop.clo()            }        },        {            text: '前往设置',            style: {color: '#4eca33'},            onclick() {                console.log('您点击了前往设置!')            }        }    ]})

emmmm,看了如上展示及调用方式,是否觉得还不错哟!哈哈哈,这可是花了无数个日夜采坑的结果。

尤其是编译到reactnative端,各种千奇百怪的问题,有些抓狂~~

另外对于不同端的一些兼容性处理,需要判断各端环境并渲染相应模板,对于rn,则使用modal

let taroenv = process.env.taro_env// 渲染窗体if (taroenv === 'rn') {    return (        <modal transparent={true} visible={isvisible} onrequestclo={this.clo}>            {rendertpl}        </modal>    )}el if (taroenv === 'h5' || taroenv === 'weapp'){    return isvisible && rendertpl}

另外在样式处理上也需注意rn端兼容性。

/** * @title     taro自定义弹窗组件 - taropop.js * @time     andy by 2019-11-28 * @about     q:282310962  wx:xy190310 */import taro from '@tarojs/taro'import { view, text, image } from '@tarojs/components'import { modal, activityindicator, touchablehighlight } from 'react-native'import classnames from 'classnames'import './index.scss'export default class taropop extends taro.component {    /**      * @ 弹窗默认配置      */    static defaultprops = {        isvisible: fal,       //弹窗显示        title: '',              //标题        content: '',            //内容        contentstyle: null,     //内容样式        style: null,            //自定义弹窗样式        skin: '',               //弹窗风格        icon: '',               //弹窗图标        xclo: fal,          //自定义关闭按钮        shade: true,            //遮罩层        shadeclo: true,       //点击遮罩关闭        opacity: '',            //遮罩透明度        time: 0,                //自动关闭时间        end: null,              //销毁弹窗回调函数        anim: 'scalein',        //弹窗动画        position: '',           //弹窗位置显示        btns: null,             //弹窗按钮 [{...args}, {...args}]    }    constructor(props) {        super(props)        this.state = {            ...this.props,        }        this.timer = null    }    /**      * @ 显示弹窗事件      */    show = (options) => {        this.tstate({            ...this.props, ...options, isvisible: true        })    }    /**      * @ 关闭弹窗事件      */    clo = () => {        this.tstate({...this.props})        this.timer && cleartimeout(this.timer)        delete this.timer        typeof this.state.end === 'function' && this.state.end.call(this)    }    /**      * @ 点击遮罩关闭      */    shadeclick = () => {        if(!this.state.shadeclo) return        this.clo()    }    render() {        let { isvisible, title, content, contentstyle, style, skin, icon, xclo, shade, shadeclo, opacity, time, end, anim, position, btns } = this.state                let toasticon = {            loading: require('./skin/loading.png'),            success: require('./skin/success.png'),            error: require('./skin/error.png'),            info: require('./skin/info.png梵蒂冈旅游'),        }        let taroenv = process.env.taro_env                ...        // 渲染h5、rn模板        const rendertpl = (            <view classname="taropop">                {/* 遮罩 */}                {shade ? <view classname="atpop__ui_mask" style={{opacity: opacity == '' ? .6 : opacity}} onclick={this.shadeclick} /> : null}                {/* 窗体 */}                <view classname="atpop__ui_main">                    <view classname={classnames('atpop__ui_child', skin && 'atpop__' + skin, position && 'atpop__ui_child-' + position)} style={style}>                        {/* 标题 */}                        {title ? <text classname={classnames('atpop__ui_tit', skin && 'atpop__ui_tit-' + skin)}>{title舞蹈大赛}</text> : null}                        {/* 内容 */}                        {content ? <view classname="atpop__ui_cnt">                            {/* toast内容 */}                            {icon && skin === 'toast' ?                                <view classname="atpop__ui_toast">                                    {icon === 'loading' && taroenv === 'rn' ?                                    <activityindicator color="rgba(255,255,255,.5)" size={24} /> : <image classname={classnames('atpop__ui_toast-img', icon=='loading' && 'atpop__ui_toast-img-loading')} src={toasticon[icon]} mode="aspectfit" />                                    }                                </view>                                :                                null                            }                            {/* 文本内容 */}                            <text classname={classnames('atpop__ui_cntxt', skin && 'atpop__ui_cntxt-' + skin)} style={contentstyle}>{content}</text>                        </view>                        :                        this.props.children                        }                        {/* 按钮 */}                        {btns ? <view classname={classnames('atpop__ui_btns', skin && 'atpop__ui_btns-' + skin)}>                            {btns.map((item, i) => {                                return taroenv === 'rn' ?                                 <touchablehighlight classname={classnames('atpop__ui_btn', skin && 'atpop__ui_btn-' + skin)} activeopacity={1} underlaycolor='rgba(200,200,200,.3)' key={i} onpress={item.onclick}>                                    <text classname={classnames('atpop__ui_btntxt', skin && 'atpop__ui_btntxt-' + skin)} style={item.style}>{item.text}</text>                                </touchablehighlight>                                :                                <view classname={classnames('atpop__ui_btn', skin && 'atpop__ui_btn-' + skin)} key={i} onclick={item.onclick}>                                    <text classname={classnames('atpop__ui_btntxt', skin && 'atpop__ui_btntxt-' + skin)} style={item.style}>{item.text}</text>                                </view>                            })}                        </view>                        :                        null                        }                    </view>                    {/* xclo */}                    {xclo ? <view classname="atpop__ui_xclo" onclick={this.clo}><image classname="atpop__ui_xclo-img" src={require('./skin/error.png')} mode="aspectfit" /></view> : null}                </view>            </view>        )        // 渲染窗体        if (taroenv === 'rn') {            return (                <modal transparent={true} visible={isvisible} onrequestclo={this.clo}>                    {rendertpl}                </modal>            )        }el if (taroenv === 'h5' || taroenv === 'weapp'){            return isvisible && rendertpl        }    }}

好了,以上就是taro自定义弹窗组件实现方式,希望能有帮助~~

本文发布于:2023-04-03 09:40:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/5da9ae44951d7cd9ef9a2105f202dd1d.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Taro自定义Modal对话框组件.doc

本文 PDF 下载地址:Taro自定义Modal对话框组件.pdf

标签:自定义   内容   样式   按钮
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图