link1370 link1371 link1372 link1373 link1374 link1375 link1376 link1377 link1378 link1379 link1380 link1381 link1382 link1383 link1384 link1385 link1386 link1387 link1388 link1389 link1390 link1391 link1392 link1393 link1394 link1395 link1396 link1397 link1398 link1399 link1400 link1401 link1402 link1403 link1404 link1405 link1406 link1407 link1408 link1409 link1410 link1411 link1412 link1413 link1414 link1415 link1416 link1417 link1418 link1419 link1420 link1421 link1422 link1423 link1424 link1425 link1426 link1427 link1428 link1429 link1430 link1431 link1432 link1433 link1434 link1435 link1436 link1437 link1438 link1439 link1440 link1441 link1442 link1443 link1444 link1445 link1446 link1447 link1448 link1449 link1450 link1451 link1452 link1453 link1454 link1455 link1456 link1457 link1458 link1459 link1460 link1461 link1462 link1463 link1464 link1465 link1466 link1467 link1468 link1469 link1470 link1471 link1472 link1473 link1474 link1475 link1476 link1477 link1478 link1479 link1480 link1481 link1482 link1483 link1484 link1485 link1486 link1487 link1488 link1489 link1490 link1491 link1492 link1493 link1494 link1495 link1496 link1497 link1498 link1499 link1500 link1501 link1502 link1503 link1504 link1505 link1506

[Vue.js] Array shows 0 as length when it has elements in it

So there is an object like so:

this.$ - this holds indexes that hold arrays. For instance, it has two different indexes: one called slide and one called thumb. Those indexes hold arrays.

I’m developing in vue.js and got those to show up with the v-ref attribute. However, whenever I do this:


It comes back as 0. I’m trying to loop through it using forEach() but can’t since it shows 0 even though there are clearly 4 VueComponent objects inside that array.

I’m not really understanding why it says slide: array[0], but then shows slide: array[4] on the next line. I tried going in this.$.slide.slide, but that’s undefined.

Thanks for any insight.


This is my HTML for Vue:

<slider inline-template img-count=”4” v-ref=”slider”>
<div class=”slides” v-style=”styles”>
<sliderslide v-repeat=”count” v-ref=”slide”>
<img src=”{ gallery_image(‘HM722_Silver_Creek_9978.jpg’, ‘full’) }” alt=”HM722 Silver Creek” style=”margin-top:-15%;” />

<div class=”thumbnails”>
<div class=”thumbnail-wrapper”>
<sliderthumb v-repeat=”count” send-index=”@{ updateIndex }” v-ref=”thumb”
image-src=”{ gallery_image(‘HM722_Silver_Creek_9978.jpg’) }”
caption=”Newest Product”>

The v-refs are already there so it should show them…

I’m console.log() all of this inside the ready method inside Vue.

Solution :

This is a timing issue. The first time you ask for the length it is indeed 0, but when you inspect the object a few seconds later with Chrome Dev Tools you are inspecting the live object which has now been filled.

You can confirm this by using setTimeout

}, 1000)

Sounds like the ready event isn’t working the way you expected.


To solve the problem of setting with photo widths without glitching, you can use setTimeout 0 to defer the execution. JS is single threaded and this will let the rendering finish before setting the width

// `0` will ‘defer’
setTimeout(this.setSlideDimensions.bind(this), 0);
setTimeout(this.setThumbDimensions.bind(this), 0);

Some people frown upon doing this as it can be a sign of bad logic, but without more knowledge of how Vue.js works, I would say this would be the best solution for now.

Updated jsFiddle