Skip to content Skip to sidebar Skip to footer

How Does One Establish State-management In Between A List Of Data-items And Their Element-node Representatives In Case Of Removing An Item On 'click'?

I'm trying to initialize a remove button in order to remove an element from the DOM and its related data-item from its locally stored list. Below is the code which is supposed to d

Solution 1:

Any implementation should break down the requirements into dedicated tasks (hence functions) e.g. for ...

  • retrieving the items from local storage,
  • rendering all storage items,
  • creating an item's element node representation,
  • the event subscription for an item's removal,
  • an item's remove handling for both removing the element node and the storage update of the original item list.

The next provided approach adds for each created item-specific element-node an individual event-listener in a way that all item-related data like the item itself, the item-list and the element-node are bound to a function; thus each deltio item gets created its own item-specific handler.

functionhandleDeltioItemRemoveWithBoundData(/* evt */) {
  const { node, item, itemList } = this;
  const removeAtIndex = itemList.findIndex(({ teams, name, location }) =>
    ((item.teams === teams) && (item.name === name) && (item.location === location))
  );
  itemList.splice(removeAtIndex, 1);

  node.remove();

  // localStorage.setItem('assoiChoices', JSON.stringify(itemList));console.log('remove deltio item :: item ...', item);
  console.log('remove deltio item :: itemList ...', itemList);
}

functionsubscribeToDeltioItemRemove(node, item, itemList) {
  node
    .querySelector('.close_but')
    .addEventListener('click', handleDeltioItemRemoveWithBoundData.bind({
      node,
      item,
      itemList,
    }));
}

functioncreateDeltioItem(item) {
  const renderBox = document.createElement('div');
  renderBox.innerHTML = `
    <div class="betslip_top_container">
      <div style="padding-left:5px;">
          <i class="close_but far fa-times-circle"></i>
      </div>
      <div class="b_s_matches">
          <p class="paroli_items">${ item.teams }</p>
          <p class="paroli_items">${ item.name }</p>
          <p class="paroli_items">${ item.location } </p>
      </div>
    </div>`;
  return renderBox.firstElementChild;  
}

functionrenderDeltioItems(rootNode, itemList) {
  itemList.forEach(item => {

    const elmNode = createDeltioItem(item);

    subscribeToDeltioItemRemove(elmNode, item, itemList);

    rootNode.appendChild(elmNode);
  });
}

functionmain() {
  const deltioItems = [
    { teams: 'The Foos', name: 'Foo Fighter', location: 'foo' },
    { teams: 'The Bars', name: 'Bar Keeper', location: 'bar' },
    { teams: 'The Bazzos', name: 'Bazooka', location: 'baz' },
  ];
  // let deltioItems = localStorage.getItem('assoiChoices');// deltioItems = JSON.parse(deltioItems);console.log('main() :: deltioItems ...', deltioItems);

  renderDeltioItems(
    document.querySelector('.bet_slip_matches'),
    deltioItems
  );
}

main();
body { margin: 0; font-size: 86%; }
p { margin: 0; padding: 0; }
.betslip_top_container { position: relative; width: 30%; }
.betslip_top_container > [style] { position: absolute; top: 0; right: 0; }
.close_but { cursor: pointer; }
.b_s_matches > p { display: inline-block; }
.b_s_matches > p:not(:last-child)::after { content: ', '; }
<linkhref="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css" /><divclass="bet_slip_matches"></div>

An event delegation based approach can subscribe the event listener at the single root node of all rendered deltio-items but needs to establish the relationship in between data-item and element-node by e.g. a unique ID.

functionhandleDeltioItemRemoveWithBoundItemList(evt) {
  // make sure the event was triggered via the "close button".// if (evt.target?.classList?.contains('close_but')) {if (evt.target?.matches('.close_but')) {

    const deltioNode = evt.target.closest('[data-uid^="deltio_item"]');
    // make sure the data-item related elemen-node exists.if (deltioNode) {

      const { uid } = deltioNode.dataset;
      const itemList = this;

      // confirm/ensure data-item + element-node relationship via unique ID.const removeAtIndex = itemList.findIndex(item => item.uid === uid);
      itemList.splice(removeAtIndex, 1);

      deltioNode.remove();

      // localStorage.setItem('assoiChoices', JSON.stringify(itemList));console.log('remove deltio item :: itemList ...', itemList);
    }
  }
}

functionsubscribeToDeltioItemRemove(rootNode, itemList) {
  rootNode
    .addEventListener(
      'click',
      handleDeltioItemRemoveWithBoundItemList.bind(itemList)
    );
}

functioncreateDeltioItem(item) {
  const renderBox = document.createElement('div');
  renderBox.innerHTML = `
    <div class="betslip_top_container">
      <div style="padding-left:5px;">
          <i class="close_but far fa-times-circle"></i>
      </div>
      <div class="b_s_matches">
          <p class="paroli_items">${ item.teams }</p>
          <p class="paroli_items">${ item.name }</p>
          <p class="paroli_items">${ item.location } </p>
      </div>
    </div>`;

  const elmNode = renderBox.firstElementChild;
  // assign the unique ID via the dataset-API.
  elmNode.dataset.uid = item.uid;

  return elmNode;
}

functionrenderDeltioItems(rootNode, itemList) {
  itemList.forEach(item =>
    rootNode.appendChild(
      createDeltioItem(item)
    )
  );
}

functionmain() {
  // let deltioItems = localStorage.getItem('assoiChoices');// deltioItems = JSON.parse(deltioItems);const deltioItems = [
    { teams: 'The Foos', name: 'Foo Fighter', location: 'foo' },
    { teams: 'The Bars', name: 'Bar Keeper', location: 'bar' },
    { teams: 'The Bazzos', name: 'Bazooka', location: 'baz' },
  ];
  const itemList = deltioItems.map((item, idx) =>// create a new data-item with an enriched unique ID.Object.assign({}, item, { uid: `deltio_item_${ idx }` })
  );
  const rootNode = document.querySelector('.bet_slip_matches');

  subscribeToDeltioItemRemove(rootNode, itemList);
  renderDeltioItems(rootNode, itemList);

  console.log('main() :: deltioItems ...', deltioItems);
  console.log('main() :: itemList ...', itemList);
}

main();
body { margin: 0; font-size: 86%; }
p { margin: 0; padding: 0; }
.betslip_top_container { position: relative; width: 30%; }
.betslip_top_container > [style] { position: absolute; top: 0; right: 0; }
.close_but { cursor: pointer; }
.b_s_matches > p { display: inline-block; }
.b_s_matches > p:not(:last-child)::after { content: ', '; }
<linkhref="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css" /><divclass="bet_slip_matches"></div>

Post a Comment for "How Does One Establish State-management In Between A List Of Data-items And Their Element-node Representatives In Case Of Removing An Item On 'click'?"