Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

203
Visualizações
Restablecer un objeto de la tienda a un valor predeterminado en SolidJS

¿Cómo restablecería completamente un valor en una tienda en SolidJS?

Tengo algo parecido a:

 interface Item { id: number, price: number, quantity: number } ​interface State { items: Array<Item> } export const ItemsContext = createContext() export const ContextProvider = (props: any) => { const [state, setState] = createStore({items: []}) const incrementItemQuantity = ({id}: Item) => { const index = state.items.findIndex(i => i.id === id) if(index !== -1) { const item = state.items[index] setState("items", index, {quantity: item.quantity + 1}) } } const clearItems = () => { setState(produce(s => s.items = [])) } const addItem = (item: Item) => { setState(produce(s => s.items.push(item)) } const value = [state, { addItem, clearItems, incrementItemQuantity} ] return ( <ItemsContext.Provider value={value} > { props.children } <ItemsContext.Provider/> ) }

Agregar un artículo e incrementar su cantidad funciona como se esperaba. Cuando yo:

  1. Agrega un artículo.
  2. Incrementa su cantidad
  3. Borrar los elementos

Espero que el estado esté en blanco. Sin embargo, si agrego un elemento con las mismas propiedades que el primero a la lista, se muestra con los valores anteriores.

No puedo entender por qué. ¿Qué no estoy haciendo bien?

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

No estás usando la API de la tienda correctamente. Por ejemplo, la ruta del elemento le proporciona el elemento, primero debe obtener el elemento, luego actualizarlo a través de un setter:

 setState("items", index, {quantity: item.quantity + 1});

Así es como puedes hacerlo correctamente:

 // Here path gives us the item setState("items", index, item => ({...item, quantity: item.quantity + 1})); // Here path gives us the property setState('items', index, 'quantity', q => q + 1);

Aquí sabrás como podrás hacerlo. No expongo tienda sino artículos. Es tu decision.

 // @refresh reload import { createContext, JSX, useContext } from "solid-js"; import { createStore, produce } from 'solid-js/store'; import { render } from "solid-js/web"; interface Item { id: number, price: number, quantity: number } interface Store { items: () => Array<Item>; add?: (item: Item) => void; increment?: (index: number) => void; clear?: () => void; }; export const CartContext = createContext<Store>(); export const CartProvider = (props: { children: JSX.Element }) => { const [store, setStore] = createStore({ items: [{ id: 0, price: 10, quantity: 1 }] }) const items = () => store.items; const add = (item: Item) => setStore('items', items => [...items, item]); const increment = (index: number) => setStore('items', index, 'quantity', q => q + 1); const clear = () => setStore('items', []); return ( <CartContext.Provider value={{ items, add, increment, clear }}> {props.children} </CartContext.Provider> ); } const Child = () => { const { items, add, increment, clear } = useContext(CartContext); return ( <div> <ul> {items().map((item, index) => ( <li>{JSON.stringify(item)} <button onclick={() => increment(index)}>inc</button></li>) )} </ul> <div> <button onClick={() => add({ id: items().length, price: 10, quantity: 1 })}>Add Item</button> {` `} <button onClick={() => clear()}>Clear Items</button> </div> </div> ) }; const App = () => { return ( <CartProvider> <Child /> </CartProvider> ); } render(App, document.querySelector("#app"));
about 4 years ago · Juan Pablo Isaza Relatório

0

No estás usando la tienda correctamente. Mira este ejemplo en vivo aquí

 import { render } from "solid-js/web"; import { createContext, useContext, For } from "solid-js"; import { createStore } from "solid-js/store"; export const CounterContext = createContext([{ items: [] }, {}]); export function CounterProvider(props) { const [state, setState] = createStore({ items: props.items || []}); const store = [ state, { add: (val) => setState("items", (c) => [...c, val]), clear: () => setState("items", () => []), }, ]; return ( <CounterContext.Provider value={store}> {props.children} </CounterContext.Provider> ); } const Counter = () => { const [state, { add,clear }] = useContext(CounterContext); return <> <For each={state.items}> {(i) => (<h1>{i}</h1>)} </For> <button onClick={() => add(state.items.length + 1)}>Add </button> <button onClick={clear}>Clear </button> </> }; const App = () => ( <CounterProvider> <Counter /> </CounterProvider> ); render(() => <App />, document.getElementById("app")!);
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda