• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Vue - stylowanie komponentów

0 głosów
322 wizyt
pytanie zadane 5 maja 2019 w JavaScript przez Bakr Mądrala (6,850 p.)

Witam,

W jaki sposób ostylować komponent w Vue z wykorzystaniem zmiennych? Np. biorąc pod uwagę data-atrybuty? W 'zwykłym' JS puszczam pętlę forEach:

    this.rings.forEach((ring) => {
      const value = this.changeTextPercentToNumber(ring.dataset.value);
      const radius = ring.r.baseVal.value;
      const circumference = radius * 2 * Math.PI;

      ring.style.strokeDasharray = `${circumference} ${circumference}`;
      ring.style.strokeDashoffset = `${circumference}`;

      const offset = circumference - value / 100 * circumference;
      ring.style.strokeDashoffset = offset;
    });

Jak zrobić to w komponencie?

Komponent:

<template>
  <div class="nearestGoals">
    <ul class="nearestGoals__list">
      <li class="nearestGoalsList__item" v-for="goal in goals">
        <svg class="progress-ring">
          <defs>
            <linearGradient id="grad1" x1="100%" y1="0%" x2="0%" y2="100%" >
              <stop offset="0%" style="stop-color:rgb(74,163,254);stop-opacity:1" />
              <stop offset="100%" style="stop-color:rgb(108,232,254);stop-opacity:1" />
            </linearGradient>
          </defs>
          <circle class="progress-ring__circle progress-ring__circle--background" r="48" cx="51" cy="51" style="stroke-dasharray: 301.593, 301.593; stroke-dashoffset: 0;"></circle>

          <circle class="progress-ring__circle" r="48" cx="51" cy="51" data-value="25%" stroke="url(#grad1)" style="stroke-dasharray: 301.593, 301.593; stroke-dashoffset: 301.926;" v-bind:style="styles"></circle>
        </svg>
        <div class="nearestGoalsItem__wrapper">
          <input class="nearestGoalsItem__name" v-model="goal.name">
          <span class="nearestGoalsItem__progress">{{money}} / {{goal.price}}</span>
        </div>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    name: 'todoList',
    data() {
      return {
        money: 400,
        goals: [
          {
            id: 0,
            name: 'Cel pierwszy',
            price: 7800,
          },
          {
            id: 1,
            name: 'Cel drugi',
            price: 4200,
          },
          {
            id: 2,
            name: 'Cel trzeci',
            price: 5900,
          },
        ]
      }
    },
    methods: {
      percentageGoal(cost) {
        alert(cost);
      }
    },

    computed: {
      styles: function() {



        const money = this.$data.money;


        return {
          'stroke-dasharray': money,
        };
      }
    }
  }
</script>

 

3 odpowiedzi

0 głosów
odpowiedź 5 maja 2019 przez niezalogowany
wybrane 5 maja 2019 przez Bakr
 
Najlepsza

A skąd będziesz miał dane do data-attributes w v-for?

komentarz 5 maja 2019 przez Bakr Mądrala (6,850 p.)
  goals: [
          {
            id: 0,
            name: 'Cel pierwszy',
            price: 7800,
          },
          {
            id: 1,
            name: 'Cel drugi',
            price: 4200,
          },
          {
            id: 2,
            name: 'Cel trzeci',
            price: 5900,
          },
        ]

Z tablicy goals.

 

komentarz 5 maja 2019 przez niezalogowany

Możesz użyć ich bezpośrednio w bindowanych stylach - kombinowanie z data-attributes jest tutaj niepotrzebne

komentarz 5 maja 2019 przez Bakr Mądrala (6,850 p.)
W jaki sposób się do nich odwołać. Nie chciałbym tego robić inline, ale przenieść do metody computed-> styles
komentarz 5 maja 2019 przez niezalogowany
<div :style="styles(goal)"> 

computed: {
  styles () {
    return goal => {
      return {
         width: goal.value + 'px',
         // ... co tam potrzebujesz
      }
    }
  }
}

Ale żeby nie tworzyć takich potworków, stwórz dodatkowy komponent GoalItem i przekaż goal propsem. Od razu poprawi się czytelność kodu.

0 głosów
odpowiedź 5 maja 2019 przez jkdfklgdf Nałogowiec (32,020 p.)

musisz zbindować atrybut style lub class np.

<template>
    <div :style="{ color: blue? 'blue' : 'black' }">
        <span @click="blue = !blue">Hello</span>
    </div>
</template>

<script>
export default {
    data() {
        return { blue: false };
    }
};
</script>

 

komentarz 5 maja 2019 przez Bakr Mądrala (6,850 p.)
A w jaki sposób uzyskać dostęp do atrybutu danego elementu?

This nie wskazuje na ten element
komentarz 6 maja 2019 przez jkdfklgdf Nałogowiec (32,020 p.)

Nie rozumiem co dokładnie masz na myśli.

 https://vuejs.org/v2/guide/class-and-style.html

–1 głos
odpowiedź 5 maja 2019 przez kubaapk Nałogowiec (44,270 p.)

Podobne pytania

0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 18 października 2018 w JavaScript przez Gambr Dyskutant (7,530 p.)
0 głosów
0 odpowiedzi 107 wizyt
pytanie zadane 14 lipca 2018 w JavaScript przez Gambr Dyskutant (7,530 p.)
0 głosów
1 odpowiedź 291 wizyt
pytanie zadane 29 stycznia 2017 w JavaScript przez Kuba Pyda Początkujący (310 p.)

93,604 zapytań

142,529 odpowiedzi

322,996 komentarzy

63,090 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...