Estoy usando Svelte y Strapi para el proyecto. Aquí hay una versión simplificada de mi problema:
El json donde quiero enviar mi solicitud PUT. ( localhost:1337/shapes/1 )
{ id: 1, name: 'square', colors: { red: false, blue: false, green: false } }Los botones de alternar en la plantilla esbelta:
{#each shapes as shape} <div on:click={toggleColor(shape, "red")}>red</div> <div on:click={toggleColor(shape, "blue")}>blue</div> <div on:click={toggleColor(shape, "green")}>green</div> {/each}La función de alternar (ver comentarios para encontrar lo que falta):
function toggleColor(shape, color) { let index = shapes.indexOf(shape); axios.put(`http://localhost:1337/shapes/${shape.id}`, { // How to write this part to toggle a color? // The commented code below doesn't work as it doesn't set a color without // reseting others siblings // colors: { // [color]: shape.colors[color] ? false : true // } }) .then((res) => { coins[index].colors[color] = res.data.colors[color]; }) .catch((err) => { console.log(err.message) }); } Para entender más claramente lo que sucede con esta versión, devuelve esta respuesta si hago clic en blue button y luego en el botón red button :
{ id: 1, name: 'square', colors: { red: true, blue: null, green: null } }Respuesta esperada:
{ id: 1, name: 'square', colors: { red: true, blue: true, green: false } }Casi estabas allí. El siguiente código:
{ colors: { [color]: shape.colors[color] ? false : true } } ...redefinirá los colors como un objeto con un solo color en él. Para obtener también los colores anteriores, use la sintaxis de propagación como:
{ colors: { ...shape.colors, [color]: shape.colors[color] ? false : true } }