【问题标题】:Using vue.js with semantic UI使用带有语义 UI 的 vue.js
【发布时间】:2016-08-09 03:25:04
【问题描述】:

我正在尝试将 webpack + Semantic UI 与 Vue.js 一起使用,我发现了这个库 https://vueui.github.io/

但是编译有问题:

ERROR in ./~/vue-ui/components/sidebar/sidebar.jade
Module parse failed: /Project/node_modules/vue-    
ui/components/sidebar/sidebar.jade Unexpected token (1:24)
You may need an appropriate loader to handle this file type.

所以我安装了jade(pug),但还是没有运气。

并且在 github 中有对该库的评论:

WIP,不要使用https://github.com/vueui/vue-ui

我已经设法在我的模板中导入语义 css,如下所示:

@import './assets/libs/semantic/dist/semantic.min.css';

但是这里的问题是我不能使用像 dimmer 和其他东西这样的语义.js 函数。

问题是我已经有一些用语义编写的旧代码库,最好不要使用任何其他 css 框架(引导程序或物化)。

有什么优雅的方式可以在我的 vue.js 项目中包含语义 UI?

【问题讨论】:

    标签: javascript webpack single-page-application vue.js semantic-ui


    【解决方案1】:

    1) 如果未安装 jQuery,请安装它(正确!):

    • npm install --save jquery
    • 然后在您的 webpack.config 文件中(我只是将它添加到 webpack.dev.config.js 中,但也许将它添加到 prod 配置文件中):

      在插件中添加new webpack.ProvidePlugin

      new webpack.ProvidePlugin({
          // jquery
          $: 'jquery',
          jQuery: 'jquery',
          'window.jQuery': 'jquery'
      })
      

      现在 jQuery 可用于所有应用程序和组件。

    好消息是,现在对于您想要使用的所有外部库(数字、时刻等)以及语义 ui,这都是相同的过程!

    我们走吧:

    • npm install --save semantic-ui-css

    nb :您可以使用主仓库(即语义 UI),但语义 ui-css 是语义 UI 的基础主题。

    所以,现在,你必须首先在 webpack.base.config.js 文件中定义别名:

    resolve.alias 下添加语义别名:

    resolve: {
        extensions: ['', '.js', '.vue'],
        fallback: [path.join(__dirname, '../node_modules')],
        alias: {
          'src': path.resolve(__dirname, '../src'),
          'assets': path.resolve(__dirname, '../src/assets'),
          'components': path.resolve(__dirname, '../src/components'),
          // adding our externals libs
          'semantic': path.resolve(__dirname, '../node_modules/semantic-ui-css/semantic.min.js')
        }
      }
    

    nb:您可以将其他外部库别名放在那里:

    // adding our externals libs
          'moment': path.resolve(__dirname, '../node_modules/moment/min/moment-with-locales.js'),
          'numeral': path.resolve(__dirname, '../node_modules/numeral/min/numeral.min.js'),
          'gridster': path.resolve(__dirname, '../node_modules/gridster/dist/jquery.gridster.min.js'),
          'semantic': path.resolve(__dirname, '../node_modules/semantic-ui-css/semantic.min.js'),
          'stapes': path.resolve(__dirname, '../node_modules/stapes/stapes.min.js')
    

    nb:在那里使用你自己的路径(通常它们应该看起来像那些!)

    ...我们即将完成...

    下一步是为插件提供者添加别名引用,就像我们刚刚为 jQuery 所做的那样 =)

    new webpack.ProvidePlugin({
          // jquery
          $: 'jquery',
          jQuery: 'jquery',
          'window.jQuery': 'jquery',
          // semantic-ui | TODO : is usefull since we import it
          semantic: 'semantic-ui-css',
          Semantic: 'semantic-ui-css',
          'semantic-ui': 'semantic-ui-css'
    })
    

    nb :这里我用了几个名字,也许 semantic 就足够了 ;-)

    同样,您可以在此处添加您的库/别名:

    new webpack.ProvidePlugin({
          // jquery
          $: 'jquery',
          jQuery: 'jquery',
          'window.jQuery': 'jquery',
          // gridster
          gridster: 'gridster',
          Gridster: 'gridster',
          // highcharts
          highcharts: 'highcharts',
          Highcharts: 'highcharts',
          // semantic-ui | TODO : is usefull since we import it
          semantic: 'semantic-ui-css',
          Semantic: 'semantic-ui-css',
          'semantic-ui': 'semantic-ui-css',
          // Moment
          moment: 'moment',
          Moment: 'moment',
          // Numeral
          numeral: 'numeral',
          Numeral: 'numeral',
          // lodash
          '_': 'lodash',
          'lodash': 'lodash',
          'Lodash': 'lodash',
          // stapes
          stapes: 'stapes',
          Stapes: 'stapes'
        })
    

    这是我在自己的项目中使用的所有外部库(您可以看到 gridster,它是一个 jQuery 插件 - 就像语义 UI 一样!)

    所以现在,还有最后一件事要做:

    • 添加语义css:

      我通过在 ma​​in.js 文件的开头添加这一行来做到这一点:

      import '../node_modules/semantic-ui-css/semantic.min.css'

    然后,在这一行之后添加:

    import semantic from 'semantic'

    现在你可以使用它了。

    我的 Vuejs 文件中的示例:

    <div class="dimension-list-item">
      <div class="ui toggle checkbox"
        :class="{ disabled : item.disabled }">
          <input type="checkbox"
            v-model="item.selected"
            :id="item.id"
            :disabled="item.disabled">
          <label :class="{disabled : item.disabled}" :for="item.id">{{item.label}} / {{item.selected}}</label>
      </div>
    </div>
    

    这个 sn-p 为带有复选框的列表创建一个简单的单元格。

    在脚本中:

    export default {
      props: ['item'],
      ready() {    
        $(this.$el.childNodes[1]).checkbox()
      }
    }
    

    结果如下:

    sample1

    sample2

    通常,一切都应该正常。

    上周我刚刚开始使用 Vuejs 进行开发,所以,也许在那里 是一个更好的方法;-)

    【讨论】:

    • ProvidePlugin和semantic-ui的别名不应该同名吗?无论如何,semantic-ui 在这里被作为一个空对象导入。它没有用。
    • 嗯,semantic-ui js 文件在这里作为一个空对象返回。有什么建议吗?
    • 您仍然需要进一步设置才能使语义 UI 字体正常工作。
    • 对于 vue@2.x,你必须使用 mounted() instead of ready()
    • 我有一个天真的问题:您在示例中所做的是“安装”DOM 元素,然后将语义-ui JS 逻辑附加到它。在处理像 React 和 Vue 这样的基于虚拟 DOM 的库时,这不是一个完全的反模式吗?永远不要操纵 DOM,因为它与虚拟 DOM 不同步?
    【解决方案2】:

    有点晚了,但现在你可以使用这个了:https://github.com/Semantic-UI-Vue/Semantic-UI-Vue。仍然是 WIP,但它具有所有基本功能。

    很容易使用:

    import Vue form 'vue';
    import SuiVue from 'semantic-ui-vue';
    
    /* ... */
    
    Vue.use(SuiVue);
    
    var app = new Vue({
      el: '#app',
      data: {
        message: 'Hello Vue!'
      },
      template: '<sui-button primary>{{message}}</sui-button>'
    });
    

    API 与 React 版本非常相似:如果您使用它,这将非常熟悉。

    如果你想玩,这里是一个 JSFiddle:https://jsfiddle.net/pvjvekce/

    免责声明:我是创作者

    【讨论】:

    • 我看过这个,是的,它确实具有所有基本功能,但它确实只是基本功能,以至于在我看来几乎不值得付出努力。跨度>
    【解决方案3】:

    这就是我的做法: (注意:我使用 vue-cli 创建项目)

    • cd 到你的 vue 项目目录并执行以下操作:

    1- 安装 gulp:

    npm install -g gulp
    

    2- 运行以下命令并按照安装说明进行操作。

    npm install semantic-ui --save
    cd semantic/
    gulp build
    

    3- 执行前面的命令后,您的“语义”文件夹中应该有一个“dist”文件夹。将此文件夹移动到位于项目根目录的“/static”文件夹。

    4- 在您的 html 模板文件中包含以下行:

    <link rel="stylesheet" type="text/css" href="/static/dist/semantic.min.css">
    <script
      src="https://code.jquery.com/jquery-3.1.1.min.js"
      integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
      crossorigin="anonymous"></script>
    <script src="/static/dist/semantic.js"></script>
    

    【讨论】:

      【解决方案4】:
      1. 安装jquerynpm install jquery
      2. 安装语义-ui-css npm install semantic-ui-css
      3. 在 main.js 中添加这个

      window.$ = window.jQuery = require('jquery') require('semantic-ui-css/semantic.css') require('semantic-ui-css/semantic.js')

      【讨论】:

      • 异常消失了,但是我发现所有semantic-ui的js都不起作用,比如我的页面有一个菜单,我可以看到css效果,但是当我尝试点击一些项目,什么也没发生
      【解决方案5】:

      如果发生这种情况,其他一切都正常,但您的按钮确保将此 .ui form 添加到您的表单中。

      【讨论】:

        猜你喜欢
        • 2017-08-27
        • 2014-01-13
        • 2018-03-11
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 2013-11-17
        相关资源
        最近更新 更多