Heim > Web-Frontend > js-Tutorial > Mit Vue von Grund auf rendern

Mit Vue von Grund auf rendern

php中世界最好的语言
Freigeben: 2018-06-08 13:56:07
Original
1331 Leute haben es durchsucht

Dieses Mal zeige ich Ihnen, wie Sie Vue Render von Grund auf verwenden. Was sind die Vorsichtsmaßnahmen für die Verwendung von Vue Render von Grund auf?

Einführung

Bei der Verwendung von Vue für die Entwicklung wird in den meisten Fällen eine Vorlage für die Entwicklung verwendet. Die Verwendung einer Vorlage ist einfach, bequem und schnell, aber manchmal ist es notwendig ist nicht sehr geeignet, die Vorlage in speziellen Szenarien zu verwenden. Um die Render-Funktion optimal nutzen zu können, habe ich mich daher entschlossen, einen genaueren Blick darauf zu werfen. Wenn Sie der Meinung sind, dass das, was unten geschrieben steht, falsch ist, weisen Sie bitte darauf hin. Ihre Interaktion mit mir ist die größte Motivation zum Schreiben.

Szenario

Szenario beschrieben auf der offiziellen Website Wenn wir beginnen, eine Komponente zu schreiben, die dynamisch ein Überschriften-Tag durch Level-Prop generiert, denken Sie vielleicht schnell darüber nach, es wie folgt zu implementieren dies:

<script type="text/x-template" id="anchored-heading-template">
 <h1 v-if="level === 1">
  <slot></slot>
 </h1>
 <h2 v-else-if="level === 2">
  <slot></slot>
 </h2>
 <h3 v-else-if="level === 3">
  <slot></slot>
 </h3>
 <h4 v-else-if="level === 4">
  <slot></slot>
 </h4>
 <h5 v-else-if="level === 5">
  <slot></slot>
 </h5>
 <h6 v-else-if="level === 6">
  <slot></slot>
 </h6>
</script>
Nach dem Login kopieren
Vue.component('anchored-heading', {
 template: '#anchored-heading-template',
 props: {
  level: {
   type: Number,
   required: true
  }
 }
})
Nach dem Login kopieren

Die Verwendung einer Vorlage ist in diesem Szenario nicht die beste Wahl: Erstens ist der Code ausführlich und um Ankerelemente in verschiedenen Headerebenen einzufügen, müssen wir

Während Vorlagen in den meisten Komponenten gut funktionieren, sind sie hier nicht sehr sauber. Versuchen wir also, das obige Beispiel mithilfe der Renderfunktion umzuschreiben:

Vue.component('anchored-heading', {
 render: function (createElement) {
  return createElement(
   'h' + this.level,  // tag name 标签名称
   this.$slots.default // 子组件中的阵列
  )
 },
 props: {
  level: {
   type: Number,
   required: true
  }
 }
})
Nach dem Login kopieren

Viel einfacher und klarer! Vereinfacht ausgedrückt ist dieser Code viel einfacher, erfordert jedoch eine umfassende Kenntnis der Instanzeigenschaften von Vue. In diesem Beispiel müssen Sie wissen, dass diese untergeordneten Elemente in $slots.default in der Komponenteninstanz gespeichert werden, wenn Sie Inhalte an eine Komponente übergeben, ohne das Slot-Attribut zu verwenden, z. B. Hello world!

Einführung in createElement-Parameter

Als nächstes müssen Sie sich damit vertraut machen, wie Sie Vorlagen in der createElement-Funktion generieren. Hier sind die von createElement akzeptierten Parameter:

createElement(
 // {String | Object | Function}
 // 一个 HTML 标签字符串,组件选项对象,或者
 // 解析上述任何一种的一个 async 异步函数,必要参数。
 'p',
 // {Object}
 // 一个包含模板相关属性的数据对象
 // 这样,您可以在 template 中使用这些属性。可选参数。
 {
  // (详情见下一节)
 },
 // {String | Array}
 // 子节点 (VNodes),由 `createElement()` 构建而成,
 // 或使用字符串来生成“文本节点”。可选参数。
 [
  '先写一些文字',
  createElement('h1', '一则头条'),
  createElement(MyComponent, {
   props: {
    someProp: 'foobar'
   }
  })
 ]
)
Nach dem Login kopieren

Drill down in das Datenobjekt

Eines ist zu beachten: Wie in der Vorlagensyntax gelten v-bind:class und v -bind:style wird speziell behandelt. Im VNode-Datenobjekt sind die folgenden Attributnamen die Felder der höchsten Ebene. Mit diesem Objekt können Sie auch normale HTML-Attribute wie DOM-Eigenschaften wie innerHTML binden (dies ersetzt die v-html-Direktive).

{
 // 和`v-bind:class`一样的 API
 'class': {
  foo: true,
  bar: false
 },
 // 和`v-bind:style`一样的 API
 style: {
  color: 'red',
  fontSize: '14px'
 },
 // 正常的 HTML 特性
 attrs: {
  id: 'foo'
 },
 // 组件 props
 props: {
  myProp: 'bar'
 },
 // DOM 属性
 domProps: {
  innerHTML: 'baz'
 },
 // 事件监听器基于 `on`
 // 所以不再支持如 `v-on:keyup.enter` 修饰器
 // 需要手动匹配 keyCode。
 on: {
  click: this.clickHandler
 },
 // 仅对于组件,用于监听原生事件,而不是组件内部使用
 // `vm.$emit` 触发的事件。
 nativeOn: {
  click: this.nativeClickHandler
 },
 // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
 // 赋值,因为 Vue 已经自动为你进行了同步。
 directives: [
  {
   name: 'my-custom-directive',
   value: '2',
   expression: '1 + 1',
   arg: 'foo',
   modifiers: {
    bar: true
   }
  }
 ],
 // Scoped slots in the form of
 // { name: props => VNode | Array<VNode> }
 scopedSlots: {
  default: props => createElement('span', props.text)
 },
 // 如果组件是其他组件的子组件,需为插槽指定名称
 slot: 'name-of-slot',
 // 其他特殊顶层属性
 key: 'myKey',
 ref: 'myRef'
}
Nach dem Login kopieren

Bedingtes Rendering

Da wir nun mit der oben genannten API vertraut sind, lasst uns einen praktischen Kampf führen.

Zuvor so geschrieben

//HTML
<p id="app">
  <p v-if="isShow">我被你发现啦!!!</p>
</p>
<vv-isshow :show="isShow"></vv-isshow>
//js
//组件形式      
Vue.component('vv-isshow', {
  props:['show'],
  template:'<p v-if="show">我被你发现啦2!!!</p>',
});
var vm = new Vue({
  el: "#app",
  data: {
    isShow:true
  }
});
Nach dem Login kopieren

Render so geschrieben

//HTML
<p id="app">
  <vv-isshow :show="isShow"><slot>我被你发现啦3!!!</slot></vv-isshow>
</p>
//js
//组件形式      
Vue.component('vv-isshow', {
  props:{
    show:{
      type: Boolean,
      default: true
    }
  },
  render:function(h){  
    if(this.show ) return h('p',this.$slots.default);
  },
});
var vm = new Vue({
  el: "#app",
  data: {
    isShow:true
  }
});
Nach dem Login kopieren

Listen-Rendering

Es wurde vorher so geschrieben, und wenn v-for, muss die Vorlage mit einem Tag umschlossen werden

//HTML
<p id="app">
  <vv-aside v-bind:list="list"></vv-aside>
</p>
//js
//组件形式      
Vue.component('vv-aside', {
  props:['list'],
  methods:{
    handelClick(item){
      console.log(item);
    }
  },
  template:'<p>\
         <p v-for="item in list" @click="handelClick(item)" :class="{odd:item.odd}">{{item.txt}}</p>\
       </p>',
  //template:'<p v-for="item in list" @click="handelClick(item)" :class="{odd:item.odd}">{{item.txt}}</p>',错误     
});
var vm = new Vue({
  el: "#app",
  data: {
    list: [{
      id: 1,
      txt: 'javaScript',
      odd: true
    }, {
      id: 2,
      txt: 'Vue',
      odd: false
    }, {
      id: 3,
      txt: 'React',
      odd: true
    }]
  }
});
Nach dem Login kopieren

render ist so geschrieben

//HTML
<p id="app">
  <vv-aside v-bind:list="list"></vv-aside>
</p>
//js
//侧边栏
Vue.component('vv-aside', {
  render: function(h) {
    var _this = this,
      ayy = this.list.map((v) => {
        return h('p', {
          'class': {
            odd: v.odd
          },
          attrs: {
            title: v.txt
          },
          on: {
            click: function() {
              return _this.handelClick(v);
            }
          }
        }, v.txt);
      });
    return h('p', ayy);
  },
  props: {
    list: {
      type: Array,
      default: () => {
        return this.list || [];
      }
    }
  },
  methods: {
    handelClick: function(item) {
      console.log(item, "item");
    }
  }
});
var vm = new Vue({
  el: "#app",
  data: {
    list: [{
      id: 1,
      txt: 'javaScript',
      odd: true
    }, {
      id: 2,
      txt: 'Vue',
      odd: false
    }, {
      id: 3,
      txt: 'React',
      odd: true
    }]
  }
});
Nach dem Login kopieren

V-Modell

Die vorherige Schreibmethode

//HTML
<p id="app">
  <vv-models v-model="txt" :txt="txt"></vv-models>
</p>
//js
//input
Vue.component('vv-models', {
  props: ['txt'],
  template: '<p>\
         <p>看官你输入的是:{{txtcout}}</p>\
         <input v-model="txtcout" type="text" />\
       </p>',
  computed: {
    txtcout:{
      get(){
        return this.txt;
      },
      set(val){
        this.$emit('input', val);
      }
      
    }
  }
});
var vm = new Vue({
  el: "#app",
  data: {
    txt: '', 
  }
});
Nach dem Login kopieren

render ist so geschrieben

//HTML
<p id="app">
  <vv-models v-model="txt" :txt="txt"></vv-models>
</p>
//js
//input
Vue.component('vv-models', {
  props: {
    txt: {
      type: String,
      default: ''
    }
  },
  render: function(h) {
    var self=this;
    return h('p',[h('p','你猜我输入的是啥:'+this.txt),h('input',{
      on:{
        input(event){
          self.$emit('input', event.target.value);
        }
      }
    })] );
  },
});
var vm = new Vue({
  el: "#app",
  data: {
    txt: '', 
  }
});
Nach dem Login kopieren

Zusammenfassung

Nutzung der Renderfunktion Darüber hinaus hat die vollständige Programmierfähigkeit von JavaScript einen absoluten Leistungsvorteil. Der Editor analysiert es gerade. Was das eigentliche Projekt betrifft, muss noch basierend auf Ihrem Projekt und den tatsächlichen Bedingungen festgelegt werden, welche Methode Sie zum Rendern wählen.

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Wie der JSON-Server Back-End-Daten generiert

Detaillierte Erläuterung der Verwendung des Vuex-Status Management

Das obige ist der detaillierte Inhalt vonMit Vue von Grund auf rendern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage