zoukankan      html  css  js  c++  java
  • 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()}
  • 相关阅读:
    climbing-stairs
    binary-tree-inorder-traversal
    search-insert-position
    balanced-binary-tree
    Java 接口工厂案例
    Java 接口案例
    Java 抽象类
    unique-paths
    maximum-subarray
    php修改文件夹下的所以图片png改为jpg,也可以作为修改为其他格式的方法
  • 原文地址:https://www.cnblogs.com/Nyan-Workflow-FC/p/13965146.html
Copyright © 2011-2022 走看看