美文网首页React Native开发
运用react插槽,自定义Madal插件

运用react插槽,自定义Madal插件

作者: SHiny_Jun | 来源:发表于2019-11-30 18:24 被阅读0次

    手摸手写一个Modal插件

    首先封装一个组件modal,其中各个参数的作用在上面都进行了解析


    image

    主角组件

    modal.js

    import { Fragment, Component } from 'react';
    import c from './index.less';
    
    /*
     * @visible {Boolean} 是否展示
     * @closeName {String} 取消键名字
     * @okName {String} 确认键名字
     * @buttonable {Boolean} 底部按钮是否隐藏
     * @cancelable {Boolean} 取消按钮是否隐藏
     * @closeable {Boolean} x按钮是否隐藏
     * @onOk {Function} 确认键回调函数
     * @onCancel {Function} 取消键和x按钮回调函数
     */
    export default class Modal extends Component {
      constructor() {
        //继承React.Component
        super();
        this.state = {};
      }
    
      render() {
        const { closeName, okName, buttonable, closeable, cancelable, onOk, onCancel, visible } = this.props;
        return (
            visible && (
              <div className={c.index}>
                <div className={c.window}>
                  {!closeable && (
                    <div className={c.close} onClick={e => { onCancel && onCancel(e);}}>×</div>
                  )}
                  <div className={c.content}>{this.props.children}</div>
                  {!buttonable && (
                    <div className={c.footerBtn}>
                      <div className={c.btns}>
                        {!cancelable && (
                          <div className={c.cancle} onClick={e => { onCancel && onCancel(e); }}>{closeName || '取消'}</div>
                        )}
                        <div className={c.ok} onClick={e => { onOk && onOk(e); }}>{okName || '确认'}</div>
                      </div>
                    </div>
                  )}
                </div>
              </div>
            )
        );
      }
    }
    
    

    首先封装一个组件modal,以下放一下样式代码,大家可以根据自己需要修改。
    index.less

    .index{
      position: fixed;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      background-color: rgba(0, 0, 0, 0.5);
      .content{
        overflow: hidden;
      }
      .window{
        margin: auto;
        top: 50%;
        transform: translateY(-50%);
        position: relative;
        width: 534px;
        min-height: 300px;
        background-color: #fff;
        border-radius:15px;
        .close{
          position: absolute;
          top: 10px;
          right: 20px;
          font-size: 50px;
          color: #bbbbbb;
        }
        .footerBtn{
          padding-top: 100px;
          .btns{
            font-size: 30px;
            position: absolute;
            display: flex;
            width: 100%;
            height: 100px;
            line-height: 100px;
            bottom: 0;
            border-top: 1px solid #eeeeee;
            >div{
              flex: 1;
              text-align: center;
              border-left: 1px solid #eeeeee;
              &:first-child{
                border-left: none;
              }
            }
          }
        }
      }
    }
    

    如何运用组件?

    先引入modal.js直接写入<modal>标签,里面的内容直接写入自己定义的样式就可以了
    index.js

    import Modal from '../Modal';
    
    export default class GetCheck extends Component {
      constructor() {
        super();
        this.state = {
          show: true,
        };
      }
      close = e => {
          this.setState({show : !this.state.show})
      }
      render() {
        return (
          <Modal visible={this.state.show} buttonable={true} onCancel={this.close}>
            <div className={c.title}>Hello World!</div>
          </Modal>
        );
      }
    }
    

    下面做一个小小的扩展

    通过自定义一个name去选择不同节点插入组价不同地方
    index.js修改标签里面的节点

    <Modal visible={this.state.show} buttonable={false} onCancel={this.close}>
         <div name="first">Hello World!</div>
         <div name="second">Hello World!</div>
     </Modal>
    

    在组件的引用有3种方法,子组件一定要使用this.props.children才能使用
    如在Modal.js里面运用

    {this.props.children}//这是一个数组 会直接把三个div直接显示在子组件中
    {this.props.children[0]}//只是把这个children数组第一个元素放到子组件中
    {this.props.children.filter(itme => itme.props.name=="first")}//这是通过filter筛选出指定自定义属性的名称来放入到子组件中
    

    结束,如果对你有帮助希望各位小哥哥可以点赞噢!
    !

    相关文章

      网友评论

        本文标题:运用react插槽,自定义Madal插件

        本文链接:https://www.haomeiwen.com/subject/hqmowctx.html