Weex初体验--创建一个简单的Weex程序

佚冰 8年前
   <p>最近阿里开源的Weex很火爆。</p>    <p>参考官网的资料学习了一下,写了一个小Demo。</p>    <p>分享出来和大家交流交流。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/073adbcab43c3061e63ad938f36d45f3.png"></p>    <h2>环境准备</h2>    <p>按照官网的教程,完成以下步骤:</p>    <ol>     <li>安装Node.js</li>     <li>安装weex-toolkit</li>    </ol>    <p>这两步完成以后,就可以进行代码的编写了。</p>    <h2>小Demo</h2>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fbf6d2299e5c97b24a68ce30461bc01c.png"></p>    <p style="text-align:center">程序界面</p>    <p>实现一个很简单功能:在文本框中输入文字,点击按钮,文字会出现在下面列表中。</p>    <h2>1、创建项目</h2>    <p>这里的Demo是将Weex集成到现有的项目中,</p>    <p>所以首先需要创建一个Android项目。</p>    <p>官网要求:</p>    <ol>     <li>已经安装了JDK version>=1.7 并配置了环境变量</li>     <li>已经安装Android SDK 并配置环境变量。</li>     <li>Android SDK version 23 (compileSdkVersion in build.gradle)</li>     <li>SDK build tools version 23.0.1 (buildToolsVersion in build.gradle)</li>     <li>Android Support Repository >= 17 (for Android Support Library)</li>    </ol>    <p>在满足这些要求的情况下,创建一个Android Studio项目。</p>    <h2>2、编写Android代码</h2>    <p>(一)添加依赖</p>    <p>glide用于图片加载。</p>    <p>其他的库都是官网要求的依赖。</p>    <pre>  <code class="language-java">compile 'com.android.support:recyclerview-v7:24.2.1'      compile 'com.android.support:appcompat-v7:24.2.1'      compile 'com.alibaba:fastjson:1.1.45'      compile 'com.taobao.android:weex_sdk:0.9.5@aar'      compile 'com.github.bumptech.glide:glide:3.7.0'</code></pre>    <p>(二)实现ImageAdapter</p>    <p>Weex要求本地实现图片的加载代码。</p>    <p>我这里使用Glide实现图片加载。</p>    <pre>  <code class="language-java">public class ImageAdapter implements IWXImgLoaderAdapter {      @Override      public void setImage(String url, ImageView view, WXImageQuality quality, WXImageStrategy strategy) {          //实现你自己的图片下载,否则图片无法显示。          Glide.with(view.getContext())                  .load(url)                  .into(view);       }  }</code></pre>    <p>(三)创建Application类</p>    <p>注意这个类一定要在Manifest中配置。</p>    <pre>  <code class="language-java">public class App extends Application {      @Override      public void onCreate() {          super.onCreate();          InitConfig config=new InitConfig.Builder().setImgAdapter(new ImageAdapter()).build();          WXSDKEngine.initialize(this,config);      }  }</code></pre>    <p>(四)编写MainActivity</p>    <p>这里做了几件事:</p>    <ol>     <li>实例化 <strong>WXSDKInstance</strong> 。</li>     <li>在Activity生命周期中回调 <strong>mWXSDKInstance</strong> 的对应方法。</li>     <li>实现 <strong>IWXRenderListener</strong> 接口 。</li>     <li>调用 <strong>mWXSDKInstance.render</strong> 方法实例化组件</li>     <li>在 <strong>IWXRenderListener.onViewCreated()</strong> 方法中设置 view 。</li>    </ol>    <p>IWXRenderListener.onViewCreated()会在Weex将JS实例化成View后回调。 <strong>IWXRenderListener</strong> 中同时还有:</p>    <p>onRenderSuccess();</p>    <p>onRefreshSuccess();</p>    <p>onException();</p>    <p>三个回调方法。</p>    <pre>  <code class="language-java">public class MainActivity extends AppCompatActivity implements IWXRenderListener {      WXSDKInstance mWXSDKInstance;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          mWXSDKInstance = new WXSDKInstance(this);          mWXSDKInstance.registerRenderListener(this);          mWXSDKInstance.render("WXSample", WXFileUtils.loadAsset("home.js",this), null, null, -1, -1, WXRenderStrategy.APPEND_ASYNC);      }      @Override      public void onViewCreated(WXSDKInstance instance, View view) {          setContentView(view);      }      @Override      public void onRenderSuccess(WXSDKInstance instance, int width, int height) {      }      @Override      public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {      }      @Override      public void onException(WXSDKInstance instance, String errCode, String msg) {      }      @Override      protected void onResume() {          super.onResume();          if (mWXSDKInstance != null) {              mWXSDKInstance.onActivityResume();          }      }      @Override      protected void onPause() {          super.onPause();          if (mWXSDKInstance != null) {              mWXSDKInstance.onActivityPause();          }      }      @Override      protected void onStop() {          super.onStop();          if (mWXSDKInstance != null) {              mWXSDKInstance.onActivityStop();          }      }      @Override      protected void onDestroy() {          super.onDestroy();          if (mWXSDKInstance != null) {              mWXSDKInstance.onActivityDestroy();          }      }  }</code></pre>    <p>到这里基本上Android端的代码就完成了。</p>    <p>剩下的任务就是编写Weex代码了。</p>    <h2>3、编写Weex代码</h2>    <p>(一)创建一个组件</p>    <p>在这里我先创建了一个Weex组件,用于显示文字,并且支持变色。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/add56662a6fb36b347fffe9fcbe31424.png"></p>    <p style="text-align:center">组件样子</p>    <p>文件名: <strong>name.we</strong></p>    <pre>  <code class="language-java"><template>      <div>          <text repeat="item in items" class="text {{item.sex}}">{{item.name}}</text>      </div>  </template>  <style>      .text{ width:750; padding-top: 10px; padding-bottom: 10px;justify-content: center;text-align: center; color:#ffffff}      .male { background-color: #9999ff; }      .female { background-color: #ff9999; }  </style>  <script>      module.exports = {          data: {              items:[]          },          methods:{          }      }  </script></code></pre>    <p>(二)创建主界面</p>    <p>注意: <strong>home.we</strong> 和 <strong>name.we</strong> 要放在同一个目录</p>    <p>文件名:home.we</p>    <pre>  <code class="language-java"><template xmlns="http://www.w3.org/1999/html">      <div>          <div style="width: 750; height: 200;">              <image class="img" src={{imageUrl}}></image>          </div>          <input ref="input" class="input" type="text"  value={{input}} oninput="oninput" />          <a class="button">                <text class="text" onclick="add">添加</text>          </a>          <name items = {{items}}></name>      </div>    </template>    <script>      module.exports = {          data: {              imageUrl: 'https://gtms02.alicdn.com/tps/i2/TB1QHKjMXXXXXadXVXX20ySQVXX-512-512.png',              input:'',              sex:'male',              items:[]          },          methods: {              oninput (event) {                  console.log('ominput:', event.value)                  this.input = event.value;              },              add(){                  if(this.input === '')                      return;                  this.items.unshift({name:this.input,sex:this.sex})                  this.input = "";                  if(this.sex === 'female'){                      this.sex = 'male';                  }else{                      this.sex = 'female';                  }              }          }      }  </script>    <style>    .img { width: 200; height: 200; margin-left: 275}    .input {        font-size: 50px;        width: 650px;        margin-top: 50px;        margin-left: 50px;        padding-top: 20px;        padding-bottom: 20px;        padding-left: 20px;        padding-right: 20px;        color: #666666;        border-width: 2px;        border-style: solid;        border-color: #41B883;      }    .button {        width: 450px;        margin-top: 30px;        margin-bottom: 30px;        margin-left: 150px;        padding-top: 20px;        padding-bottom: 20px;        border-width: 2px;        border-style: solid;        border-color: #DDDDDD;        background-color: #F5F5F5      }      .text {        font-size: 30px;        color: #666666;        text-align: center;      }  </style></code></pre>    <p>(三)调试 we文件</p>    <p>这个时候需要用到之前安装的 <strong>weex-toolkit</strong> 工具。</p>    <p>直接执行命令:</p>    <pre>  <code class="language-java">weex home.we</code></pre>    <p>这时候会打开默认浏览器,</p>    <p>我们就会看到我们所的界面。</p>    <p>这里支持热更新,只要你在源文件中做了更改并保存,这个界面就会跟着刷新成最新状态。特别方便。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d5ffa81273b63920e0b77de0f3cb19a7.png"></p>    <p style="text-align:center">预览界面</p>    <p>(四)转换编写的 we文件</p>    <p>调试没有问题后,就需要使用Weex命令转换成JS文件了。</p>    <p>使用命令:</p>    <pre>  <code class="language-java">weex home.we --output home.js</code></pre>    <p>这个时候就会在当前目录下找见 <strong>home.js</strong> 了。</p>    <p>这个 <strong>home.js</strong> 就是我们要在 Android项目中加载的文件了。</p>    <p>(五)导入JS并运行程序</p>    <p>拷入转换后的JS文件(我这里是直接在assets目录编写的we,所以会有三个文件)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/80deaba68f316997ae0d60eb5a3d7a8f.png"></p>    <p style="text-align:center">目录结构</p>    <p>在代码中加载 js 文件</p>    <pre>  <code class="language-java">// WXFileUtils.loadAsset("home.js",this) 这个方法会加载assets下的js   mWXSDKInstance.render("WXSample", WXFileUtils.loadAsset("home.js",this), null, null, -1, -1, WXRenderStrategy.APPEND_ASYNC);</code></pre>    <p>点击运行:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1843aec4e1d297751ac0ab091fcde765.png"></p>    <p style="text-align:center">运行界面</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/d9487554de3c</p>    <p> </p>