请教如何利用JS完成简单的商品筛选问题

新手上路,请多包涵

1.设定一个数组,其中存放有全部商品的名称,并在界面左侧的边框中显示出来
2.当用户点击左侧边框中的商品,表示选中该商品,则将该商品从左侧的列表中删除,并添加到右侧的选中列表中;
3.注意,在右侧的选中列表中商品名称要按顺序排序,添加新选中的商品名,也要插入到对应的顺序位置

图片描述

阅读 2.6k
3 个回答

简单说下,把选中的商品和未选中的商品做一个标记,当商品选中状态改变时,改变状态。让选中的展示在左边,未选中的展示在右边。如果左边和右边的排序一致的话,控制显示隐藏就行了。如果不一致的话,展示的时候重排序或者第一次展示重排序,后期选择插入就行了。

先说一个最原始的方法实现

class Dispatcher {
    constructor() {
        this._event = [];
    }
    on(eventName, fn) {
        var subscription = {
            eventName,
            callback: fn
        };
        this._event.push(subscription);
        return this;
    }
    off(eventName, fn) {
        this._event = this._event.filter(
            subscription => !(subscription.eventName === eventName && (fn ? subscription.callback === fn : true))
        );
        return this;
    }
    emit(eventName, ...data) {
        this._event.forEach(subscription => {
            if (subscription.eventName === eventName) {
                subscription.callback(...data);
            }
        });
        return this;
    }
}

var leftList = [
    {productId: 10006},
    {productId: 10031},
    {productId: 10016},
    {productId: 10017},
];


var leftList = leftList.map((item, index) => ({...item, order: index,}));

var rightList = [];

var dispatch = new Dispatcher();

dispatch.on('select', function(product) {
    leftList = leftList.filter(_product => product !== _product);
    rightList.push(product);
});

dispatch.on('unselect', function(product) {
    rightList = rightList.filter(_product => product !== _product);
    leftList.push(product);
});

dispatch.emit('select', leftList[0]);
console.log('leftList: ', [...leftList],'\n', 'rightList', [...rightList]);

dispatch.emit('unselect', rightList[0]);
console.log('leftList: ', [...leftList],'\n', 'rightList', [...rightList]);

然后再说一个比较Vue的,左右两列应该算兄弟组件之间的通信,组件的代码和视图的代码应该在两个js文件。组件的通信可以通过子组建1 -> 父组件 -> 子组建2,但是比较麻烦。

我感觉可以用Vuex了。

新手上路,请多包涵

请标明右侧以什么顺序排列

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏