zoukankan      html  css  js  c++  java
  • vue2中使用jsx简单总结 sk

    Vue 中使用 JSX

    1.开始

    在 Vue 中使用 JSX,需要使用 Babel 插件,它可以让我们回到更接近于模板的语法上

    // 安装依赖:
    npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
    // 配置 .babelrc :
    module.exports = {
      presets: [
        '@vue/cli-plugin-babel/preset',
        ['@vue/babel-preset-jsx',
          {
            'injectH': false
          }]
      ]
    }
    

    2.基础内容

    这里展示在 Vue 中书写一些基础内容,包括纯文本、动态内容、标签使用、自定义组件的使用,这些跟我们平时使用单文件组件类似,如下所示:

    render() {
      return (
        <div>
          <h3>内容</h3>
          {/* 纯文本 */}
          <p>hello, I am Gopal</p>
          {/* 动态内容 */}
          <p>hello { this.msg }</p>
          {/* 输入框 */}
          <input />
          {/* 自定义组件 */}
          <myComponent></myComponent>
        </div>
      );
    }
    

    3.Attributes/Props

    // 3.1 Attributes 的绑定跟普通的 HTML 结构一样
    render() {
      return <div><input placeholder="111" /></div>
    }
    
    // 3.2 注意,如果动态属性,之前是 v-bind:placeholder="this.placeholderText" 变成了placeholder={this.placeholderText}
    render() {
      return <input
                type="email"
                placeholder={this.placeholderText}
              />
    }
    
    // 3.3 我们也可以展开一个对象
    render (createElement) {
        return (
            <button {...this.largeProps}></button>
        )
    }
    
    // 3.4 像 input 标签,就可以如下批量绑定属性
    const inputAttrs = {
        type: 'email',
        placeholder: 'Enter your email'
    };
    render() {
      return <input {...{ attrs: inputAttrs }} /> 
    }
    

    4.插槽

    具名插槽:父组件的写法和单文件组件模板的类似,通过 slot="header" 这样方式指定要插入的位置。子组件通过 this.$slots.header 方式指定插槽的名称,其中 header 就是插槽的名称

    // 父组件:
    render() {
      {/* 具名插槽  */}
      <myComponent>
        <header slot="header">header</header>
        <header slot="content">content</header>
        <footer slot="footer">footer</footer>
      </myComponent>
    }
    
    // 子组件:
    render() {
      return (
        <div>
          {/* 纯文本 */}
          <p>我是自定义组件</p>
          {this.$slots.header}
          {this.$slots.content}
          {this.$slots.footer}
        </div>
      );
    }
    

    作用域插槽:子组件中通过 {this.$scopedSlots.test({ user: this.user })} 指定插槽的名称是 test,并将 user 传递给父组件。父组件在书写子组件标签的时候,通过 scopedSlots 值指定插入的位置是 test,并在回调函数获取到子组件传入的 user 值

    // 父组件:
    render() {
      {/* 具名插槽 作用域插槽 */}
      <myComponent {
        ...{
          scopedSlots: {
            test: ({user}) => (
              <div>{user.name}</div>
            )
          }
        }
      }>
      </myComponent>
    }
    
    // 子组件:
    render() {
      return (
        <div>
          {this.$scopedSlots.test({
            user: this.user
          })}
        </div>
      );
    }
    

    5.指令

    // 常见的指令如下所示:
    render() {
      {/* 指令 */}
      {/* v-model */}
      <div><input vModel={this.newTodoText} /></div>
      {/* v-model 以及修饰符 */}
      <div><input vModel_trim={this.tirmData} /></div>
      {/* v-on 监听事件 */}
      <div><input vOn:input={this.inputText} /></div>
      {/* v-on 监听事件以及修饰符 */}
      <div><input vOn:click_stop_prevent={this.inputText} /></div>
      {/* v-html */}
      <p domPropsInnerHTML={html} />
    }
    

    6.函数式组件

    // 函数式组件是一个无状态、无实例的组件,详见官网说明,新建一个 FunctionalComponent.js 文件,内容如下:
    export default ({ props }) => <p>hello {props.message}</p>
    
    // 父组件中调用如下:
    import funComponent from './FunctionalComponent'
    ...
    render() {
      return {/* 函数式组件 */}
            <funComponent message="Gopal"></funComponent>
    }
    

    7.常用的vue jsx写法

    // 7.1 v-for 可使用map方法进行循环操作:
    <el-table>
      {
        this.fields.map(item => {
            return(
              <el-table-column prop={item.prop}></el-table-column>
            )
        })
      }
    </el-table>
    
    // 7.2 v-if 使用三目运算符或者if else
    render(h){
      return (
        this.show ? <div>111</div> : <span>222</span>
      )
    }
    或
    render(h){
      return (
        <div>
          {
            this.show && (<span>aaa</span>)
          }
          <span>bbb</span>
        </div>
      )
    }
    
    // 7.3 v-on @  常用的@click等事件
    <div on-click={this.handleClick}></div>
    
    
    
  • 相关阅读:
    调用Win32 API netapi32.dll 实现UNC(网络共享)连接的管理(一)
    一个重写Page基类的例子
    36进制进位算法例子
    关于.net 中调用script的alert后 css失效的办法
    Javascript:keyCode键码值表
    Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件
    在.NET程序中正确使用String类型
    Sql Server中自动序号的方法
    托管和非托管的关系和区别
    Oracle 格式化
  • 原文地址:https://www.cnblogs.com/xm0328/p/15561157.html
Copyright © 2011-2022 走看看