lujiahao

引入

css

<link rel="stylesheet" href="/static/lib/select2/dist/css/select2.css">

js

    <script src="/static/lib/select2/dist/js/select2.min.js"></script>
    <script src="/static/lib/select2/dist/js/i18n/zh-CN.js"></script>

html

只需要一个select元素即可

<select id="select2" name="column_id[]" multiple></select>

使用

如果是要在模态框中使用需要监听模态框加载完毕后再初始化插件
以及插件基本上的使用选项都展示在下面了。

            //模态框展示完毕
            $(\'#myModal\').on(\'show.bs.modal\', function (e) {
                $(\'#select2\').select2({
                    //主题,如果是用bootstrap的话建议用官方的bootstrap主题,
                    //如果你使用bootstrap4的主题,官网的https://github.com/ttskch/select2-bootstrap4-theme
                    //bootstrap3:网友维护 https://github.com/select2/select2-bootstrap-theme 可能还不如自带的好看
                    //default classic
                    theme: "classic",
                    //父容器,如果你是在模态框中使用需要指定这个(bootstrap)
                    dropdownParent: $(\'#modal-body1\'),
                    language: \'zh-CN\',
                    //弹出的检索框的宽度
                    width: \'100%\',
                    //默认提示
                    placeholder: \'请选择\',
                    //至少输入几个字符才开始检索
                    // minimumInputLength: 1,
                    //可否手动删除
                    allowClear: true,
                    //是否多选
                    multiple: true,
                    //最多只能选择3个项目
                    maximumSelectionLength: 3,
                    //通过ajax请求来获取数据
                    ajax: {
                        url: \'<{url(\'/article/search/column\')}>\',
                        dataType: \'json\',
                        delay: 500,// 延迟显示
                        data: function (params) {
                            return {
                                // 搜索框内输入的内容
                                keyword: params.term,
                                // 第几页
                                page: params.page || 1,
                            };
                        },
                        // 返回结果预处理为select2需要的固定格式
                        // processResults : function(data, params) {
                        //     params.page = params.page || 1;
                        //
                        //     return {
                        //         // 后台返回的数据集
                        //         results : data.data,
                        //         pagination : {
                        //             // 总页数为10,那么1-9页的时候都可以下拉刷新
                        //             more : params.page < data.total
                        //         }
                        //     };
                        // },
                        //设置为false的话,那么每次请求都会携带一个随机时间戳格式参数
                        cache: true
                    },

                    // 让template的html显示效果,否则输出代码
                    escapeMarkup: function (markup) {
                        return markup;
                    },
                    // 搜索结果样式自定义
                    // templateResult: function (option) {
                    //     if (option.loading) return option;
                    //
                    //
                    //     var markup = \'<div> <p class="text-primary">学科名称:\' + option.text  + \'</p>\';
                    //     markup += \' </div>\';
                    //     return markup;
                    // },
                    // 点击option后显示在输入框中的文本自定义
                    // templateSelection: function (option) {
                    //     return option.name || option.text;
                    // }

                });
            })

接口返回数据格式

select2插件要求的格式,可以完全通过服务端来做,也可以通过插件提供的方法进行格式化

{
  "results": [
    {
      "id": 1,
      "text": "Option 1"
    },
    {
      "id": 2,
      "text": "Option 2"
    }
  ],
  "pagination": {
    "more": true
  }
}

解释一波,more 如果为true则select2插件下拉框拉到底部则会继续发生请求。

完全由服务端返回格式

这里是thinkphp6,如果你是用的tp6可以直接复制过去使用

    public function search(Request $request)
    {

        //接收当前页码
        $page = $request->get(\'page\');

        //接收搜索的关键词
        $kwd = $request->get(\'keyword\');

        //select2插件需要返回的格式
        $ret_format = [
            \'results\' => [
//                [
//                    \'id\' => 1,
//                    \'text\' => \'王二小\',
//
//                ],
//                [
//                    \'id\' => 2,
//                    \'text\' => \'option2\',
//                    "selected" => true
//                ],
//                [
//                    \'id\' => 3,
//                    \'text\' => \'option3\',
//                    "disabled" => true
//                ],
            ],
            \'pagination\' => [
                \'more\' => false
            ]
        ];

        //每页多少条
        $pageSize = $this->pagesize;

        //查询对象
        $query = Column::where(\'user_id\', $this->user_id)
            ->when($kwd, function ($query) use ($kwd) {
                $query->where(\'name\', \'like\', "%{$kwd}%");
            });

        //总记录条数
        $count = $query->count();

        //如果没有数据就直接返回
        if ($count == 0) {
            return json($ret_format);
        }
        //计算总页码数量
        $countPages = ceil($count / $pageSize);

        //是否可以继续请求下一页(当前页<总页数 说明可以继续请求下一页)
        $paginationMore = $page < $countPages;

        //查询
        $columns = $query->page((int)$page, $pageSize)->select();

        foreach ($columns as $column) {
            $temp = [];
            $temp[\'id\'] = $column->id;
            $temp[\'text\'] = $column->name;
            $ret_format[\'results\'][] = $temp;
            $ret_format[\'pagination\'][\'more\'] = $paginationMore;
        }
        return json($ret_format);
    }

image
image

默认样式有点丑陋,官方提供支持最新的主题bootstrap支持到v4,样式就特别好看了。

前端处理方式

如果是前端程序员不能修改后端格式,可以通过插件自行格式化...这里以后有用到再去找教程

数据回显

多选和单选同理

模板语法直接在页面上遍历回显

注意:多选的情况下 select 一定要添加 multiple属性 以及option 选项要添加 selected

                                <select id="select2" name="column_id[]" multiple>

                                    <{foreach $article->columns as $column}>
                                        <option value="<{$column->id}>" selected><{$column->name}></option>
                                    <{/foreach}>

                                </select>

js回显


            var hrew = [{id: 15, name: \'分类名称1\'},{id: 16, name: \'分类名称2\'}];

            $.each(hrew, function (index, value) {
                $(\'#select2\').append(new Option(value.name, value.id, false, true));
            });

            $(\'#select2\').trigger("change");

封装成一个方法

            //select2 插件回显
            function echoSelect2(dom, value) {
                $.each(value, function (index, value) {
                    $(dom).append(new Option(value.name, value.id, false, true));
                });
                $(dom).trigger("change");
            }

使用

let data = [{id: 1, name: \'分类1\'},{id: 2, name: \'分类2\'}];
echoSelect2("#select2", data);

结语

这个插件很强大也很好用。类似的插件也还有一个,如果你是使用的bootstrap的,那么推荐使用bootstrap-select

分类:

技术点:

相关文章: