亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

react寫一個select組件的實現代碼

2024-05-06 16:49:30
字體:
來源:轉載
供稿:網友

之前一直用的antd的Select組件,但在有些端并不適用,而原生的select樣式修改不靈活,遂產生自己寫一個組件的想法。觀察select組件:

<select onChange={(value) => {this.value=value}}  <option value='1'>man</option>  <option value='0'>woman</option></select>

可以看出數據都是在option中,有值value和顯示出來的數據一一對應。如果我們寫一個select組件,那么應該有onChange方法,應該要訪問到子元素,而且div是沒有value這個屬性的,所以option應該也是一個組件,有value屬性。下面是我寫的組件的用法:

import {MobileSelect, MobileOption} from '../../components/MobileSelect'; <MobileSelect  disabled={isDisabled}  value={data.clarity || ringResponse.clarity || 'Flawless'}  style={{ width: '132px' }}  onChange={(v) => this.changeDataValue('clarity', v)} >  {   (clarity || []).map((item, i) => {    return (     <MobileOption key={i + ''} value={item.code}>{item.title}</MobileOption>    );   })  } </MobileSelect>

可以看出其和一般的select組件用法差不多。效果如下:

react,select,組件,代碼

下面是組件

import {observable} from 'mobx';import {observer} from 'mobx-react';import React from 'react';import {Icon} from 'antd';import './index.less';interface IProps { disabled?: boolean; onChange?: (value) => void; value?: string | number; style?: React.CSSProperties; className?: string;}@observerexport class MobileSelect extends React.Component<IProps> { @observable showOption = false;   // 是否彈出下拉框 @observable value: any = '';    // 當前選中的value值 @observable text: any = '';     // 選中的value值對應的文本 @observable cell: any;       // 組件的dom節點 componentDidMount(): void {  // 獲取選擇框的ref,當在組件外點擊時的時候收起下拉框  document.addEventListener('click', (e) => {   if (this.cell && this.cell !== e.target && !this.cell.contains(e.target)) {    this.showOption = false;   }  }, true); } componentWillReceiveProps(nextProps: Readonly<IProps>, nextContext: any): void {  // 根據傳入的value值,遍歷children,找到對應值的展示文本  if (nextProps.value !== this.props.value || nextProps.children !== this.props.children) {   React.Children.map(this.props.children, (child, index) => {    if (nextProps.value === child.props.value) {     this.text = child.props.children;    }   });  } } render(): React.ReactNode {  const {children, value} = this.props;  console.log(value);  return (   <div    className={'Mobile-Select ' + this.props.className}    style={this.props.style}    ref={(node) => this.cell = node}   >    <div     className={'select-wrap'}     onClick={() => {      // 禁用不能彈出下拉框      if (!this.props.disabled) {       this.showOption = !this.showOption;      }     }}    >     <Icon type='down' style={this.showOption ? {transform: 'rotate(180deg)'} : {transform: 'rotate(0deg)'}} className={'select-icon'}/>     {this.text}    </div>    <div className={'option-wrap'} style={this.showOption ? {position: 'absolute'} : {display: 'none'}}>     {      React.Children.map(children, (child, index) => {       // 設置選中option和未選中option的樣式       let optionClassName = '';       if (this.props.value === child.props.value) {        optionClassName = child.props.className ? child.props.className + ' option-item selected' : 'option-item selected';       } else {        optionClassName = child.props.className + ' option-item';       }       return (        <div         onClick={() => {     // 為了在父組件給子組件添加onClick事件,包裹了一層div          // 有無onChange事件都能改變值          if (this.props.value && this.props.onChange) {           this.props.onChange(child.props.value);          } else {           this.text = child.props.children;           this.value = child.props.value;          }          console.log(this.value);          this.showOption = !this.showOption;         }}         style={this.props.style}         className={optionClassName}        >{child}</div>       );      })     }    </div>   </div>  ); }}interface OptionProps { value?: string | number; className?: string; style?: React.CSSProperties;}export class MobileOption extends React.Component<OptionProps> { render(): React.ReactNode {  const {children} = this.props;  return (   <div style={this.props.style}>    {children}   </div>  ); }}

下面是組件的樣式

.Mobile-Select { display: inline-block; min-width: 100px; margin: 0 6px; .select-wrap {  border: 1px solid #e0c0a2;  border-radius: 4px;  padding: 5px 11px;  display: flex;  flex-direction: row-reverse;  justify-content: space-between;  align-items: center;  .select-icon {   transition: .3s;   float: right;  } } .option-wrap {  box-shadow: 0 0 5px #333;  z-index: 1000;  border-radius: 5px;  .option-item {   background-color: #fff;   padding: 2px 11px;   min-width: 100px;   &.selected {    background-color: #fbe6d0;   }  } }}

總的來說只實現了select的基本功能。有改進的地方請指點一二。

PS:React Select默認值選中問題

import React from "react";import { render } from "react-dom";class App extends React.Component { constructor(props) {  super(props);  this.state = {   projects: [],   value: ""  }; } componentDidMount() {  // 模擬ajax調用,成功之后把需要改變的默認值賦值給this.state.value  setTimeout(() => {   this.setState({    projects: [     { id: 1, name: "花生" },     { id: 2, name: "蘋果" },     { id: 3, name: "楊桃" }    ],    value: 1   });  }, 3000); } handleClick() {  this.setState({   projects: [    { id: 4, name: "水果" },    { id: 5, name: "西瓜" },    { id: 6, name: "哈哈哈" }   ],   value: 4  }); } handleChange = e => {  this.setState({   value: e.target.value  }); }; render() {  let projects = this.state.projects;  return (   <div>    <button onClick={this.handleClick.bind(this)}>異步拉取數據</button>    {/* 這里不用再去判斷project的長度是否大于0,在ajax里面做判斷就行,如果小于零或者不存在它就是默認值 */}    <select     defaultValue=""     value={this.state.value}     onChange={this.handleChange}    >     {projects.length > 0 &&      projects.map((item, i) => {       return (        <option key={i} value={item.id}>         {item.name}        </option>       );      })}    </select>   </div>  ); }}render(<App />, document.getElementById("root"));

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91tv亚洲精品香蕉国产一区7ujn| 欧美精品在线视频观看| 亚洲国产99精品国自产| 亚洲欧洲在线播放| 岛国av午夜精品| 精品激情国产视频| 国产精品久久久久久搜索| 久久久久这里只有精品| 国产91精品久久久久久| 日本久久亚洲电影| xxxxxxxxx欧美| 亚洲在线视频观看| 国产一区二区三区在线免费观看| 国语自产在线不卡| 欧美裸体xxxx极品少妇软件| 亚洲精品国精品久久99热| 中文字幕视频一区二区在线有码| 欧美性色xo影院| 亚洲а∨天堂久久精品9966| 奇米成人av国产一区二区三区| 成人久久久久久| 亚洲人成绝费网站色www| 亚洲一区二区三区香蕉| 国产亚洲欧洲高清一区| 97婷婷大伊香蕉精品视频| 日韩欧美精品网址| 91国语精品自产拍在线观看性色| 欧美成人精品一区二区| 欧美精品videos性欧美| 欧美性极品xxxx娇小| 国产精品欧美激情在线播放| 国产精品极品美女在线观看免费| 亚洲第一免费播放区| 欧美视频免费在线观看| 日韩欧美一区二区三区久久| 欧美在线视频免费观看| 欧美大片在线看| 最近免费中文字幕视频2019| 久久人人爽人人爽人人片av高清| 欧美一级bbbbb性bbbb喷潮片| 欧美国产日韩二区| 亚洲国产精品小视频| 中文字幕欧美日韩va免费视频| 亚洲精品乱码久久久久久按摩观| 91爱视频在线| 深夜福利国产精品| 久久99精品久久久久久噜噜| 日本精品久久中文字幕佐佐木| 国产一区二区香蕉| 亚洲精选中文字幕| 亚洲专区中文字幕| 日韩av在线不卡| 欧美激情免费观看| 日韩欧美成人区| 最近日韩中文字幕中文| 欧美精品www在线观看| 欧美性猛交xxxx富婆| 最近2019年中文视频免费在线观看| 在线看福利67194| 国产97色在线|日韩| 欧美性猛交xxxx富婆弯腰| 久久精品成人欧美大片古装| 午夜精品一区二区三区在线| 亚洲偷欧美偷国内偷| 国内精品模特av私拍在线观看| 久久精品国产亚洲| 中文综合在线观看| 久久天堂电影网| 日韩在线一区二区三区免费视频| 97国产一区二区精品久久呦| 国产精品6699| 日韩毛片在线看| 成人欧美一区二区三区在线| 成人激情电影一区二区| 久热精品视频在线| 精品久久久久久久久久久久久| 国产69精品99久久久久久宅男| 国产经典一区二区| 欧美日韩国产123| 海角国产乱辈乱精品视频| 成人免费自拍视频| 亚洲精品国产精品国自产在线| 欧美日韩在线视频观看| 丁香五六月婷婷久久激情| 国产视频久久久久久久| 在线亚洲午夜片av大片| 日韩av影视在线| 亚洲999一在线观看www| 久久中文字幕在线| 日韩欧美一区二区在线| 国产成人中文字幕| 国产在线视频一区| 国产欧美日韩高清| 国产精品羞羞答答| …久久精品99久久香蕉国产| 亚洲最大福利视频网| 久久久久国产精品一区| 8x拔播拔播x8国产精品| 国外成人性视频| 国产精品中文久久久久久久| 欧美日韩中文字幕在线| 亚洲va电影大全| 在线播放日韩专区| 国产精品电影久久久久电影网| 国产偷国产偷亚洲清高网站| 日本19禁啪啪免费观看www| 日本精品视频网站| 久久久久久中文字幕| 中文字幕欧美日韩| 色噜噜国产精品视频一区二区| 国产啪精品视频| 国产小视频国产精品| 狠狠色狠狠色综合日日小说| 欧美日韩在线看| 欧美日本精品在线| 91成品人片a无限观看| 欧美影院久久久| 欧美日韩免费看| 中文字幕av一区中文字幕天堂| 欧美人与性动交| 欧洲成人免费aa| 国产视频久久久久| 久久91亚洲精品中文字幕奶水| 精品久久久久久久久久国产| 国内精品久久久久| 久久久天堂国产精品女人| 69久久夜色精品国产69乱青草| 91九色国产社区在线观看| 国产亚洲欧洲在线| 久久成人国产精品| 欧美午夜激情小视频| 欧美激情亚洲另类| 国产精品一久久香蕉国产线看观看| 国产区精品视频| 7m第一福利500精品视频| 亚洲视频在线观看网站| 国产欧美一区二区三区久久| 成人免费福利视频| 2021久久精品国产99国产精品| 国产成人精品午夜| 国精产品一区一区三区有限在线| 亚洲视屏在线播放| 日韩精品在线免费播放| 成人激情视频网| 欧美特黄级在线| 精品国产福利视频| 欧美黄色成人网| 欧美大尺度激情区在线播放| 日韩a**站在线观看| 一区二区三区回区在观看免费视频| 国产精品电影在线观看| 国产99久久久欧美黑人| 亚洲午夜未满十八勿入免费观看全集| 亚洲福利在线播放| 亚洲风情亚aⅴ在线发布| 91精品啪aⅴ在线观看国产| 成人在线免费观看视视频| 国产精品∨欧美精品v日韩精品| 亚洲福利在线播放| 日韩av在线资源| 伊人男人综合视频网| 亚洲自拍偷拍在线| 亚洲人成网站免费播放| 青青精品视频播放|