Vue.js 지침을 사용하여 모두 선택 기능을 구현하는 방법

不言
풀어 주다: 2018-06-29 11:52:31
원래의
2463명이 탐색했습니다.

이 글은 주로 Vue.js 명령을 사용하여 모두 선택 기능을 구현하는 방법을 소개합니다. 이제 특정 참조 값을 공유합니다.

최근에 두 가지를 수행했습니다. 둘 다 필요한 Vue 프로젝트는 모두 선택하고 선택 항목을 반전시키는 기능을 구현하기 위해 두 가지 구현 방법을 사용했습니다. 첫 번째 프로젝트는 vue의 계산을 사용했고 두 번째 프로젝트는 이를 구현하기 위해 지침을 사용했습니다. 지침이 더 편리합니다. 다음으로 전체 선택 지침을 사용하는 방법을 소개합니다.

Vue 작업을 막 시작했기 때문에 전체 선택 구현은 Zhihu의 구현 방법을 참조합니다.

1. 서버에서 데이터를 가져와 각 항목에 대해 확인 속성을 설정합니다

2. 선택한 항목을 계산합니다. number selectCount , 선택한 항목 개수가 selectItem 개수와 같으면 선택한 항목 모두 선택

3. 전체 선택 클릭 시 각 항목의 selected 속성을 true로 설정하고, 선택 항목을 반전할 때는 false로 설정하고, 4. selectItems의 속성이 변경될 때마다 true로 확인된 항목이 selectedGroups 배열에 배치됩니다. 구현 코드는 다음과 같습니다.

 //全选
 data: function() {
  return {
   selectItems: [], // 从服务器拿到的数据
  }
 },
 computed: {
  // 全选checkbox绑定的model
  selectAll: {
   get: function() {
    return this.selectCount == this.selectItems.length;
   },
   set: function(value) {
    this.selectItems.forEach(function(item) {
     item.checked = value;
    });
    return value;
   }
  },
  //选中的数量
  selectCount: {
   get: function() {
    var i = 0;
    this.selectItems.forEach(function(item) {
     if (item.checked) {
      i++;
     }
    });
    return i;
   }
  },
  //选中的数组
  checkedGroups: {
   get: function() {
    var checkedGroups = [];
    this.selectItems.forEach(function(item) {
     if (item.checked) {
      checkedGroups.push(item);
     }
    });
    return checkedGroups;
   }
  }
 }
로그인 후 복사

이 방법은 우선 사용하기 편리하지 않습니다. 모두 재현이 어렵습니다. 사용하면 사용할 때마다 계산을 한 번씩 작성해야 합니다. 둘째, selectAll,checkedGroups, selectItems가 모두 고정되어 그다지 유연하지 않습니다.

그래서 이 프로젝트에서는 vue 명령어를 사용하여 모두 선택 기능을 다시 구현했습니다. ​​​​지시문의 아이디어는 실제로 계산과 유사합니다. 먼저 코드는

export default {
 'check-all': {
  twoWay: true,
  params: ['checkData'],
  bind() {
   /**
    - 如果所有的列表的checked属性都为true,则选中全选框,否则不选中全选框
    */
   this.vm.$watch(this.params.checkData, (checkData) => {
    if (checkData.every((item) => item.checked)) {
     this.set(true);
    } else {
     this.set(false);
    }
   }, { deep: true });
  },
  // checkAll发生更改时
  update(checkAll) {
   /**
    - 如果全选框被选中,则将列表的所有checked属性转为true,否则转为false
    */
   if (checkAll) {
    this.vm[this.params.checkData].forEach((item) => {
     item.checked = true;
    });
   } else {
    this.vm[this.params.checkData].forEach((item) => {
     item.checked = false;
    });
   }
  },
 },
};
로그인 후 복사

호출입니다.

<input type="checkbox" v-model="checkAll" v-check-all="checkAll" check-data="checkData">
  <ul>
   <li v-for="item in checkData">
    <input type="checkbox" v-model="item.checked">
    {{item.text}}
   </li>
  </ul>
로그인 후 복사

먼저 이 방법을 사용할 때의 장점에 대해 이야기해 보겠습니다.

1 필요한 경우 v-check-all을 작성하면 편리합니다. 명령과 check-data</ code>가 가능합니다<p><strong><br/>2. 완전히 선택된 모델과 배열 이름을 checkAll로 지정하지 않으려면 임의의 이름을 사용할 수 있습니다. , checkAllData라고 부를 수 있습니다. 배열을 checkData라고 부르지 않으려면 dataFromServer라고 부를 수 있습니다. </strong></p>명령에서 twoWay를 true로 지정하면 <code>this.set(value)를 사용하여 checkAll의 값을 설정할 수 있고 params를 사용하여 바인딩 명령 요소에서 checkData 속성 값을 받을 수 있습니다. 작업 배열이 필요합니다.

v-check-all指令和check-data就可以

2、全选的model和数组名可以定制,用什么名字都可以,全选的model不想叫checkAll叫checkAllData也可以,数组不想叫checkData叫dataFromServer也可以。

在指令中,指定twoWay为true,就可以用this.set(value)来设置checkAll的值,用params接收绑定指令元素上的属性值checkData,也就是需要操作的数组。

this.vm获取使用指令的上下文,调用上下文的$watch来监听checkData的变化,如果checkData全部选中,则设置checkAll为true,否则设置checkAll为false。

当指令值(checkAll)发生变化,如果为true,则将checkData的checked属性都设为true,否则为false。至此,一个全选的指令就完成了。

在做这个全选指令的时候,本来想用paramWatchers来监听checkData的变化的,但是发觉checkData变动时,并不会触发paramWatchers的回调,后来看了一下源码才发现,paramWatchers其实也是调用了$watchthis.vm을 사용하여 명령어 사용 컨텍스트를 얻고 컨텍스트의 $watch를 호출하여 checkData의 변경 사항을 모니터링합니다. 모든 checkData가 선택된 경우 checkAll을 다음으로 설정합니다. true, 그렇지 않으면 checkAll을 false로 설정합니다.

명령값(checkAll)이 변경될 때 true이면 checkData의 selected 속성을 true로 설정하고, 그렇지 않으면 false로 설정합니다. 이 시점에서 모두 선택 명령이 완료됩니다.

이 select all 명령을 수행할 때 원래는 paramWatchers를 사용하여 checkData의 변경 사항을 모니터링하려고 했지만 checkData가 변경되면 paramWatchers의 콜백이 트리거되지 않는다는 것을 발견했습니다. 소스 코드를 살펴본 후 paramWatchers는 실제로 $watch를 호출했지만 심층 탐지를 지원하지 않습니다.

Directive.prototype._setupParamWatcher = function (key, expression) {
 var self = this;
 var called = false;
 var unwatch = (this._scope || this.vm).$watch(expression, function (val, oldVal) {
 self.params[key] = val;
 // since we are in immediate mode,
 // only call the param change callbacks if this is not the first update.
 if (called) {
  var cb = self.paramWatchers && self.paramWatchers[key];
  if (cb) {
  cb.call(self, val, oldVal);
  }
 } else {
  called = true;
 }
 }, {
 immediate: true,
 user: false
 });(this._paramUnwatchFns || (this._paramUnwatchFns = [])).push(unwatch);
};
로그인 후 복사

위는 이 기사의 전체 내용입니다. 더 많은 관련 내용을 알아보는 데 도움이 되기를 바랍니다. , PHP 중국어 웹사이트를 주목해주세요! 관련 권장 사항:

vue 라우팅 사용 분석에 대해

vue에서 sass 전역 변수를 도입하는 방법 분석에 대해

vue-router를 사용하여 간단한 탐색 기능 완성

🎜 🎜 🎜 🎜

위 내용은 Vue.js 지침을 사용하여 모두 선택 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿