• taro3.x: Picker简单使用


    封装单个picker:

    import React, { useState } from 'react'
    import { View, PickerView, PickerViewColumn } from '@tarojs/components'
    import classnames from 'classnames'
    
    import './index.scss'
    
    export interface IPicker {
        name: string
        show: boolean
        list: any[]
    }
    
    export const INIT_PICKER: IPicker = {
        name: '',
        show: false,
        list: []
    }
    
    interface IProps extends IPicker {
        onConfirm: (any) => void
    }
    
    const CustomPicker = (props: IProps) => {
        const { list, show, onConfirm } = props
        const [current, setCurrent] = useState<any>(null)
    
        const handleChange = (e: any) => {
            const index = e.detail.value[0]
            setCurrent(list[index])
        }
    
        const handleConfirm = (isConfirm: boolean) => {
            if (isConfirm) {
                onConfirm(current || list[0])
            } else {
                onConfirm(null)
            }
        }
        return (
            <View className={classnames('picker', show && 'show')}>
                <View className="mask show" onClick={() => onConfirm(null)}></View>
                <View className="picker-content">
                    <View className="dialog-header">
                        <View className="dialog-button cancel" onClick={() => handleConfirm(false)}>取消</View>
                        <View className="dialog-button" onClick={() => handleConfirm(true)}>确定</View>
                    </View>
                    <PickerView className='picker-view-wrap' onChange={handleChange}>
                        <PickerViewColumn>
                            {
                                list.map((item: any, index: number) => {
                                    return <View className="picker-item" key={index}>{item.name}</View>
                                })
                            }
                        </PickerViewColumn>
                    </PickerView>
                </View>
            </View>
        )
    }
    
    export default CustomPicker

    scss:

    .picker {
        position: absolute;
        top: 0;
        bottom: 0;
        width: 100%;
        height: 100vh;
        visibility: hidden;
        &.show {
            visibility: visible;
            .picker-content {
                transform: translateY(0);
                transition: all 0.4s ease;
            }
        }
    
        .picker-content {
            position: fixed;
            bottom: 0;
            width: 100%;
            background-color: $white;
            transform: translateY(150%);
            transition: all 0.4s ease;
            z-index: 99;
    
            .dialog-header {
                width: 100%;
                background: $bg-color;
                display: flex;
                justify-content: space-between;
                align-items: center;
    
                .dialog-button {
                    display: inline-block;
                    text-align: center;
                    font-size: 32px;
                    color: $primary-color;
                    padding: 30px;
                    &.cancel {
                        color: $text-color;
                    }
                }
            }
    
            .picker-view-wrap {
                width: 100%;
                height: 400px;
                .picker-item {
                    line-height: 70px;
                    font-size: 36px;
                    text-align: center;
                }
            }
        }
    }

    使用:

    const INIT_PICKER_VALUE = {
        areaList: {}
    }
    
        const [picker, setPicker] = useState<IPicker>(INIT_PICKER)
        const [pickerValue, setPickerValue] = useState<any>(INIT_PICKER_VALUE)
    
        const selectPicker = (name: string) => {
            setPicker({
                name,
                show: true,
                list: houseAttr[name]
            })
        }
    
        const handlePickerConfirm = (item: any) => {
            if (item) {
                setPickerValue({
                    ...pickerValue,
                    [picker.name]: item
                })
            }
            setPicker({
                name: '',
                show: false,
                list: []
            })
        }
    
        const renderPickerValue = (value: string) => {
            return value ?
                <Text className="input-text">{value}</Text> :
                <Text className="input-placeholder">请选择</Text>
        }
    
        const renderPicker = (name: string, text: string) => (
            <View className="sale-item mt20" onClick={() => selectPicker(name)}>
                <View className="item-text">{text}</View>
                <View className="item-input">
                    {renderPickerValue(pickerValue[name].name)}
                </View>
                <View className="item-icon">
                    <Text className="iconfont iconarrow-right-bold"></Text>
                </View>
            </View>
        )
    
        const customPicker = () => useMemo(() => {
            return (
                <CustomPicker
                    name={picker.name}
                    show={picker.show}
                    list={picker.list}
                    onConfirm={handlePickerConfirm}
                ></CustomPicker>
            )
        }, [picker])
    
    {renderPicker('areaList', '区域')}
    
     {customPicker()}
  • 相关阅读:
    css 透明气泡效果
    uniapp 跳转tabbar页面传递参数
    unaipp 发送验证码倒计时
    uniapp 返回顶部
    js 实现放大镜效果
    js 禁用右键菜单和禁止复制
    js 表格的添加和删除操作
    js 留言板(带删除功能)
    推荐几个好用的网站
    pc端使用rem适配
  • 原文地址:https://www.cnblogs.com/Nyan-Workflow-FC/p/13965146.html
Copyright © 2020-2023  润新知