자세 한 설명 Vue 사용자 정의 명령 으로 드 롭 다운 메뉴 완성(select 구성 요소)

이번에 공 유 된 것 은 Vue 사용자 정의 명령 의 사용 방법 에 관 한 것 입 니 다.기 초 를 배 운 후에 우 리 는 실전 에서 드 롭 다운 목록 을 완성 합 니 다.쓸데없는 말 은 하지 않 고 바로 건어물 에 올 립 니 다.
기본 용법

//    
Vue.directive('my-directive', {
 //     
})

//     
var app = new Vue({
 el: '#app'
 directives: {
  'my-directive': {
    //     
  }
})
Vue 에 대해 잘 아 는 사람 이 다 알 고 있 을 거 라 고 믿 습 니 다.directive 의 작성 방법 은 구성 요소 와 대체적으로 유사 합 니 다.다만 방법 명 은 component 에서 directive 로 바 뀌 었 습 니 다.위의 예 는 사용자 정의 명령 v-my-directive 만 등 록 했 을 뿐 구체 적 인 기능 은 실현 되 지 않 았 습 니 다.다음은 사용자 정의 명령 의 각 옵션 을 구체 적 으로 소개 합 니 다.
명령 정의 함수 가 몇 개의 갈고리 함 수 를 제공 합 니 다(선택 가능).
4.567917.bid:한 번 만 호출 하고 명령 이 처음으로 요소 에 연결 되 었 을 때 호출 합 니 다.이 갈고리 함수 로 연결 할 때 한 번 실행 하 는 초기 화 동작 을 정의 할 수 있 습 니 다
  • inserted:바 인 딩 요소 가 부모 노드 에 삽입 되 었 을 때 호출(부모 노드 가 존재 하면 호출 할 수 있 고 document 에 저장 할 필요 가 없습니다)
  • update:구성 요소 의 VNode 업데이트 시 호출 되 지만 아이의 VNode 업데이트 전에 발생 할 수 있 습 니 다.명령 의 값 이 바 뀌 었 을 수도 있 고 없 을 수도 있 습 니 다.그러나 업데이트 전후의 값 을 비교 해서 불필요 한 템 플 릿 업 데 이 트 를 무시 할 수 있 습 니 다
  • componentUpdated:구성 요소 의 VNode 와 그 아이의 VNode 를 모두 업데이트 할 때 호출 합 니 다
  • unbid:한 번 만 호출 하고 명령 과 요 소 를 풀 때 호출 합 니 다
  • 수요 에 따라 서로 다른 갈고리 함수 에서 논리 코드 를 완성 할 수 있 습 니 다.예 를 들 어 아래 v-focus 는 요소 가 부모 노드 에 삽 입 될 때 호출 되 기 를 원 합 니 다.가장 좋 은 것 은 inserted 입 니 다.예제 코드 는 다음 과 같다.
    
    // html  
    <div id="app" v-focus>
    // js  
    Vue.directive('focus', {
     //          DOM  。
     inserted: function (el) {
      //     
      el.focus()
     }
    })
    
    효 과 는 아래 그림 과 같다.

    사용자 정의 명령 v-focus.png
    이 페이지 를 열 면 input 입력 상자 가 자동 으로 초점 을 가 져 와 입력 가능 한 상태 가 됩 니 다.
    모든 갈고리 함 수 는 몇 개의 매개 변 수 를 사용 할 수 있 습 니 다.예 를 들 어 우리 위 에 엘 을 사 용 했 습 니 다.그들의 의 미 는 다음 과 같다.
  • el:명령 에 연 결 된 요 소 는 DOM 을 직접 조작 할 수 있 습 니 다
  • binding:한 대상,다음 속성 포함:
  • name:명령 명,v-접 두 사 는 포함 되 지 않 습 니 다
  • value:명령 의 바 인 딩 값,예 를 들 어 v-my-directive="1+1",value 의 값 은 2 입 니 다
  • oldValue:명령 이 연 결 된 이전 값 은 update 와 componentUpdated 갈고리 에서 만 사용 할 수 있 습 니 다.값 이 바 뀌 든 안 바 뀌 든 사용 할 수 있 습 니 다
  • expression:바 인 딩 값 의 문자열 형식 입 니 다.예 를 들 어 v-my-directive="1+1",expression 의 값 은"1+1"입 니 다
  • arg:명령 에 전 달 된 매개 변수.예 를 들 어 v-my-directive:foo,arg 의 값 은"foo"입 니 다
  • modifiers:수정자 가 포 함 된 대상.예 를 들 어 v-my-directive.foo.bar,수정자 대상 modifiers 의 값 은{foo:true,bar:true}입 니 다
  • vnode:Vue 컴 파일 로 생 성 된 가상 노드,조회VNode API더 자세 한 정 보 를 알 아 보 세 요
  • oldVnode:이전 가상 노드 는 update 와 componentUpdated 갈고리 에서 만 사용 할 수 있 습 니 다
  • 다음은 상기 매개 변 수 를 결합 한 구체 적 인 예제 입 니 다.코드 는 다음 과 같 습 니 다.
    
    // HTML  
    <div id="app" v-demo:msg.a.b="message">
     <div v-text:msg.a.b="message"></div>
    </div>
    // JS  
    Vue.directive('demo', {
     bind: function (el, binding, vnode) {
      var s = JSON.stringify
      el.innerHTML =
       'name: '    + binding.name + '<br>' +
       'value: '   + binding.value + '<br>' +
       'expression: ' + binding.expression + '<br>' +
       'argument: '  + binding.arg + '<br>' +
       'modifiers: ' + JSON.stringify(binding.modifiers).modifiers + '<br>' +
       'vnode keys: ' + Object.keys(vnode).join(',')
     }
    })
    new Vue({
     el: '#app',
     data: {
      message: 'some text'
     }
    })
    실행 후
    의 내용 은 innerHTML 리 셋 을 사용 합 니 다.결 과 는?
    
    name: "test"
    value: "some text"
    expression: "message"
    argument: "msg"
    modifiers: {"a":true,"b":true}
    vnode keys: tag, data, children, text, elm, ns, context, functionalContext, functionalOptions, functionalScopeId, key, componentOptions, componentInstance, parent, raw, isStatic, isRootInsert, isComment, isCloned, isOnce, asyncFactory, asyncMeta, isAsyncPlaceholder
    대부분의 사용 장면 에서 우 리 는 bind 갈고리 에 사건 을 연결 합 니 다.예 를 들 어 document 에 addEventListerer 로 연결 합 니 다.unbind 에 있 습 니 다.
    removeEventListener 가 묶 여 있 습 니 다.전형 적 인 예 는 이 요 소 를 마우스 에 따라 끌 어 당 기 는 것 입 니 다.
    더 많은 값 이 필요 하 다 면 사용자 정의 명령 도 자바 스 크 립 트 대상 의 글자 수 를 입력 할 수 있 습 니 다.합 법 적 인 형식의 자바 스 크 립 트 표현 식 이 라면 모두 가능 합 니 다.예제 코드 는 다음 과 같다.
    
    // HTML  
    <div id="app" v-demo:msg.a.b="message">
     <div v-test="{msg: 'hello', name: 'Aresn'}"></div>
    </div>
    
    //JS  
    Vue.directive('test', {
     bind: function (el, binding, vnode) {
      console.log(binding.value.msg)
      console.log(binding.value.name)
     }
    })
    var app = new Vue({
     el: '#app'
    })
    
    
    Vue 2.x 는 대량의 Vue 1.x 사용자 정의 명령 의 설정 을 제거 합 니 다.사용자 정의 명령 을 사용 할 때 업무 수 요 를 분해 해 야 합 니 다.사용자 정의 명령 이 아니 라 구성 요소 가 필요 할 때 가 많 기 때 문 입 니 다.
    기본 적 인 이야기 가 끝 났 습 니 다.directive 가 제공 하 는 API 에 따라 외부 영역 을 클릭 하면 드 롭 다운 목록 이 사라 질 수 있 는 메뉴 를 작성 합 니 다.
    
    // HTML  
    <div id="app" v-clock>
     <div class="main" v-clickoutside="handleClose">
      <button @click="show = !show">        </button>
      <div class="dropdown" v-show="show">
       <p>     ,          </p>
      </div>
    </div>
    
    // JS  
    var app = new Vue({
     el: '#app',
     data: {
      show: false
     },
    methods: {
     handleClose() {
      this.show = false;
     }
    }
    })
    
    Vue.directive('clickoutside', {
     bind: function(el, binding, vode) {
      function documentHandler (e) {
       if (el.contains(e.target)) {
        return false
       }
       if (binding.expression) {
        binding.value(e)
       }
      }
      el.__vueClickOutSide__ = documentHandler
      document.addEventListener('click', documentHandler)
     },
     unbind: function(el, binding) {
      document.removeEventListener('click', el.__vueClickOutSide__)
      delete el.__vueClickOutSide__
     }
    })
    
    
    document 에 click 이 벤트 를 연결 하려 면 bind 갈고리 에 함수 document Handler 를 설명 하고 document 의 click 이벤트 에 핸들 로 지정 합 니 다.document Handler 함 수 는 두 가지 판단 을 했 습 니 다.첫 번 째 는 클릭 한 영역 이 명령 이 있 는 요소 내부 인지 판단 하 는 것 입 니 다.만약 그렇다면 함 수 를 뛰 쳐 나 가 믿 지 않 고 계속 실행 합 니 다.
    contains 방법 은 요소 A 에 요소 B 가 포함 되 어 있 는 지 판단 하 는 데 사 용 됩 니 다.true 로 돌아 가 는 것 을 포함 하고 false 로 돌아 가 는 것 을 포함 하지 않 습 니 다.
    
    // HTML
    <div id="parent">
        
     <div id="children">   </div>
    </div>
    // JS
    var a = doucment.getElemengById('parent')
    var b = doucment.getElemengById('children')
    console.log(A.contains(B)) // true
    console.log(B.contains(A)) // false
    
    두 번 째 판단 은 현재 명령 v-clickoutside 에 표현 식 이 있 는 지 여부 입 니 다.이 사용자 정의 명령 에 서 는 표현 식 이 첫 번 째 함수 일 것 입 니 다.내부 요 소 를 걸 러 낸 후 외부 모든 영역 을 누 르 면 사용자 표현 식 의 함 수 를 초대 해 야 하기 때문에 biding.value 는 문맥 methods 에서 지정 한 함 수 를 실행 합 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기