Можем ли мы использовать функцию jquery onscroll в Vue.js ?

#javascript #html #jquery #vue.js #vue-component

#javascript #HTML #jquery #vue.js #vue-компонент

Вопрос:

я хочу использовать функцию jQuery on scroll, чтобы поместить мою панель навигации вверху в vue.js как я могу это сделать.

это то, что я делаю со своими компонентами, то есть панелью навигации в bootstrap, которую я хочу вставить в scroll. также дайте мне знать, какой-либо лучший подход или решение, пожалуйста, дайте мне

»’

 <template>
<div>
  <b-navbar class="navbars" toggleable="lg" type="dark" variant="info" v-on:scroll="scrollFunction">
      <router-link to="/"><b-navbar-brand href="/">Home</b-navbar-brand></router-link>
    <b-navbar-toggle target="nav-collapse"></b-navbar-toggle>

    <b-collapse id="nav-collapse" is-nav>
      <b-navbar-nav>
       <router-link to="/contact"><b-nav-item href="/contact">contact</b-nav-item></router-link>
        <b-nav-item href="#" disabled>Disabled</b-nav-item>
      </b-navbar-nav>

      <!-- Right aligned nav items -->
      <b-navbar-nav class="ml-auto">
        <b-nav-form>
          <b-form-input size="sm" class="mr-sm-2" placeholder="Search"></b-form-input>
          <b-button size="sm" class="my-2 my-sm-0" type="submit">Search</b-button>
        </b-nav-form>

        <b-nav-item-dropdown text="Lang" right>
          <b-dropdown-item href="#">EN</b-dropdown-item>
          <b-dropdown-item href="#">ES</b-dropdown-item>
          <b-dropdown-item href="#">RU</b-dropdown-item>
          <b-dropdown-item href="#">FA</b-dropdown-item>
        </b-nav-item-dropdown>

        <b-nav-item-dropdown right>
          <!-- Using 'button-content' slot -->
          <template v-slot:button-content>
            <em>User</em>
          </template>
          <b-dropdown-item href="#">Profile</b-dropdown-item>
          <b-dropdown-item href="#">Sign Out</b-dropdown-item>
        </b-nav-item-dropdown>
      </b-navbar-nav>
    </b-collapse>
  </b-navbar>
</div>
</template>
  

»’

Мой скрипт этого компонента не работает у меня, кто-нибудь может мне помочь

 <script>
import $ from 'jquery'
export default {
  name: 'AppNav',
  
  created () {
    window.addEventListener('scroll', this.scrollFunction);
  },
  destroyed () {
    window.removeEventListener('scroll', this.scrollFunction);
  },
  methods: {
    scrollFunction (event) {
      // Any code to be executed when the window is scrolled
       $(window).on('scroll', () => {
        if ($(this).scrollTop() > 20) { // Set position from top to add class
          $('.navbars').addClass('header-appear');
        }
        else {
          $('.navbars').removeClass('header-appear');
        }
      });
    }
  }

}
</script>
  

Ответ №1:

Я думаю, вы можете достичь желаемого эффекта без jQuery. В принципе, вам нужно условие для класса элемента (см. :class=... ), основанное на событии прокрутки (см. @scroll=... ). Помогает ли этот пример?

 var app = new Vue({
  el: '.scroll-demo',
  data: {
    scrollStatus:false,
    scrollTriggerY:50
  },
  created:function(){
    window.addEventListener("scroll", this.scrollManager);
  },
  methods:{
    scrollManager:function(){
      var scrollY = this.$refs["scrollParent"].scrollTop;
      this.scrollStatus = scrollY > this.scrollTriggerY;
    }
  }
});  
 div {
  border:1px solid #333;
}
.scroll-demo {
  position:relative;
  height:200px;
  overflow:auto;
}
.main-content {
  height:1000px;
}
.nav-bar {
  height:30px;
  background-color:grey;
}
.header-appear {
  background-color:red;
  position:sticky;
  top:0px;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<!-- just some demo app -->
<div class="scroll-demo" @scroll="scrollManager" ref="scrollParent">
  <div class="nav-bar" :class="{'header-appear': scrollStatus}">...navbar...</div>
  <div class="main-content">
    <p>Lorem ipsum...</p>
    <p>Lorem ipsum...</p>
    <p>Lorem ipsum...</p>
  </div>
</div>  

Ответ №2:

В зависимости от структуры вашего документа и точного поведения, которого вы хотите достичь, вероятно, это может быть достигнуто только с помощью свойства CSS position: sticky. Это не всегда возможно и имеет некоторые ограничения, но стоит попробовать.