4

So im creating a basic tasklist where i want to set them done, when the <li>is clicked. When it's clicked i want that a class is added to the <li> thats clicked. i could not figure this out with the docs so i hope someone could help me out :D

The code i already have:

        <transition-group name="list">
            <li  class="list-item list-group-item"  v-for="(task, index) in list" :key="task.id" v-on:click="finishTask(task.id)" >
                @{{ task.text }}
                <button @click="removeTask(task.id)" class="btn btn-danger btn-xs pull-right">Delete</button>
            </li>
        </transition-group>



    </ul>

</div>

    // get the csrf token from the meta
var csrf_token = $('meta[name="csrf-token"]').attr('content');

export default {
    data() {
        return {
            list: [],
            taskInput: {
                id: '',
                text: ''
            }
        };
    },

    // So the tasks will show when the page is loaded
    created() {
        this.allTasks();
    },

    methods: {
        // get all the existing tasks
        allTasks() {
            axios.get('tasks').then((response) => {
                this.list = response.data;
            });
        },
        // create a new task
        createTask() {
            axios({
                method: 'post',
                url: '/tasks',
                data: {
                    _token: csrf_token,
                    text: this.taskInput.text,
                },
            }).then(response => {
                this.taskInput.text = '';
                this.allTasks();
            });
        },
        // remove the tasks
        removeTask(id) {
            axios.get('tasks/' + id).then((response) => {
                this.allTasks();
            });
        },
        finishTask(id) {
            axios({
                method: 'post',
                url: 'tasks/done/' + id,
                data: {
                    _token: csrf_token,
                    data: this.taskInput,
                },
            }).then(response => {
                this.allTasks();
            });
        }
    }
}

I know how i should do this with jquery but not with vue js, i hope this aint a to stupid question :D

2 Answers 2

8

You can bind css classes and styles, add a Boolean done property to your note object with default value of false, when you click the note change its done property to true. here is an example

new Vue({
    el:"#app",
  data:{
    notes: [ 
            { text: "First note", done:false  }, 
        { text: "Second note", done:false  }, 
        { text: "Third note", done:false  }, 
        { text: "Fourth note", done:false  }, 
        { text: "Fifth note", done:false  } 
      ]
  },
  methods:{
    finishNote(note){
        // send your api request
      // then update your note
      note.done = true
    }
  }
})
.done{
  background-color:green;
}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<div id="app">
  <ul>
    <li v-for="note in notes" :class="{done:note.done}" @click="finishNote(note)">{{note.text}}</li>
  </ul>
</div>

Sign up to request clarification or add additional context in comments.

1 Comment

Well that was pretty stupid of myself, i tried some thing with the :class function but i just didn't do it the right way. Thank you for the answer !
7

You can use the event argument. Which is automatically provided on your on click method.

onListClicked(event) {
  event.target.className += " myClass";
}

Here I did a demo for you: https://jsfiddle.net/6wpbp70g/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.