2016-01-15 18 views
6

Tôi đang cố gắng xây dựng một ứng dụng trò chuyện đơn giản với Vue.js. Vấn đề của tôi là vùng tin nhắn cần phải cuộn xuống dưới cùng khi một tin nhắn mới được viết.Vue.js: sự kiện sau khi v-for được thực hiện

Tôi lặp qua các thư có chỉ thị v-cho. Có sự kiện khi v-for đã cập nhật DOM không?

Tôi đã tạo nó để div khu vực tin nhắn lắng nghe mảng tin nhắn của thành phần. Tôi đã cố gắng để trong cùng một chức năng mà tôi đang thêm thông điệp vào mảng, nó sẽ thiết lập scrollTop của khu vực tin nhắn div thành 99999. Nhưng vấn đề là v-for không được thực hiện cập nhật DOM, vì vậy nó sẽ không di chuyển đến điểm chính xác.

+0

Tôi không biết nếu có một cái móc hay sự kiện sau khi một 'vòng lặp v-for' được thực hiện, nhưng bạn có thể làm như thế nào trong mỗi cho, so sánh chỉ mục thực tế để kiểm tra xem đó có phải là lần lặp cuối cùng không? một cái gì đó như '$ index === array.length - 1' và liên kết với lớp hoặc kiểu để tạo cuộn div? –

Trả lời

3

Bạn đã thử sử dụng watch?

var vm = new Vue({ 
    data: { 
    messages: [] 
    }, 
    watch: { 
    'messages': function (val, oldVal) { 
     //Scroll to bottom 
    }, 
    } 
}) 

Chỉnh sửa: Hãy xem giải pháp khác yêu cầu sử dụng chức năng nextTick để đảm bảo DOM được cập nhật.

+0

Huh, điều đó thực sự hiệu quả! Tôi nghĩ rằng 'xem' sẽ chỉ kích hoạt khi biến thay đổi, không phải sau khi tất cả các callbacks khác. Cảm ơn! – Risse

+0

Bất kỳ ý tưởng nào về cách tôi có thể gọi một phương thức của cá thể vue từ người quan sát? –

+1

@SebastianHernandez Chỉ cần sử dụng 'this' – Jeff

17

Tôi gặp sự cố tương tự nhưng tôi đã thực hiện một cách tiếp cận khác bằng cách sử dụng vue.nextTick(). Tôi cần đảm bảo rằng v-for đã hoàn thành hiển thị vì thành phần sẽ không hiển thị lại ngay lập tức, nó sẽ cập nhật vào "đánh dấu" tiếp theo khi hàng đợi trống.

Vue.component('message', { 
    data() { 
    return { 
     message: [] 
    } 
    }, 
    methods: { 
    updateMessageArray(newMessage) { 
     this.message.push(newMessage); 

     this.$nextTick(() => { 
     // Scroll Down 
     }) 
    } 
    } 
}) 

https://vuejs.org/v2/api/#Vue-nextTick

https://vuejs.org/v2/guide/reactivity.html#Async-Update-Queue

+1

Đây là giải pháp hợp lệ! Đánh dấu tiếp theo là điều duy nhất có thể đảm bảo DOM trả lại các thay đổi bạn đã chỉ định trên dữ liệu cá thể. Giải pháp được chấp nhận từ phía trên sẽ cuộn xuống trước khi các thay đổi được áp dụng cho DOM. Nếu bạn muốn chúng được áp dụng sau đó, sau đó sử dụng giải pháp này :). –

+0

Đây là giải pháp tốt hơn !! –

+0

như @CristiJora đã nói về những thay đổi sẽ được áp dụng sau 'điều này. $ NextTick (function() {}) 'giải pháp này hoạt động tuyệt vời –

Các vấn đề liên quan