Earlier we shared a way to use vUE using the React idea.

With many times in the group in order to make the view layer more clear, and some complex logic processing, resulting in the current VUE code JSX code more and more, here is a finishing note

How to use

See this article from Tencent alloyTeam first:

  • Write vUE components in JSX

The babel-plugin-transform-vue-jsx Babel 6 plugin is used to handle JSX compilation.

Of course, it is possible that the authorities also know that JSX has advantages over templates in certain scenarios, so they have a separate repository to enhance the above plug-ins. github.com/vuejs/jsx can be used in the case of Babel 7+


npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props <! --.babelrc--> {"presets": ["@vue/babel-preset-jsx"]}Copy the code


You can now use v-Model for two-way binding in JSX! Of course this is just grammar candy. You can also implement V-for using Babel.

For some simple cases we can just use JSX instead of Template without any problems, but as we drill down, we’ll look at some react specific modes such as render props in vue. It is time to compare and understand the attribute differences of vUE instances. (Render props = slotProps. Default)

  • Cn.vuejs.org/v2/guide/re…
  • www.yuque.com/zeka/vue/vu…

Integration issues with component libraries

For ANTD-vue, the API implementation is basically the same as the React version, so the call method is basically the same as the react version document.


import {Input} form 'ant-design-vue'
<Input value={xx} onChange={(e)=>{}}>

//----

const HelloWorld = ({ props }) => <p>hello {props.message}</p>
Copy the code


However, there are some less friendly component libraries such as iView. Since most of the internal APIS use the form this.$emit(‘ on-xxevent ‘), @on-xxEvent=”xx” is fine with the template syntax. But it’s weird in JSX syntax. As follows:


<Input value={xx} on-on-Change={(e)=>{}}>Copy the code


Above we dealt with the problem of using JSX directly. So can we be more like react?

Single file component

A vue single-file component we might write at this point would look like this:

VueForm.vue


<script>
export default {
  name: 'VueForm',
  props: {},
  data() {
    return{}},render() {return (
        <div>
            <input />
        </div>
    )
  }
}
</script>
<style ></style>Copy the code


How to use.js or JSX files directly?

VueForm.jsx


const VueForm = {
  name: 'VueForm',
  props: {},
  data() {
    return {}
  },
  methods:{
  
  },
  render() {return (
        <div>
            <input />
        </div>
    )
  }
}
VueForm.install = function(Vue) {
  Vue.component(VueForm.name, VueForm);
};

export default VueForm;Copy the code


Each component has to define the install method and also have to write methods. Or even simpler?

class component

Vue provides the vue-class-Component module, so we can write code like this.


import Vue from 'vue'
import Component from 'vue-class-component'

@Component({
  props: {
    propMessage: String
  }
})
export default class App extends Vue {
  // initial data
  msg = 123
  // use prop values for initial data
  helloMsg = 'Hello, ' + this.propMessage
  // lifecycle hook
  mounted () {
    this.greet()
  }
  // computed
  get computedMsg () {
    return 'computed ' + this.msg
  }
  // method
  greet () {
    alert('greeting: ' + this.msg)
  }
  render() {return (
        <input vModel={this.msg}>
        <p>prop: {this.propMessage}</p>
        <p>msg: {this.msg}</p>
        <p>helloMsg: {this.helloMsg}</p>
        <p>computed msg: {this.computedMsg}</p>
        <button onClick={this.greet}>Greet</button>
    )
  }
}Copy the code


Of course, that alone may not be enough. You need another module vue-property-decorator or even a vuex-class

Huh? Isn’t React + Mobx?